开发者

Python图像处理之图像融合与ROI区域绘制详解

开发者 https://www.devze.com 2022-12-09 13:03 出处:网络 作者: Eastmount
目录一.图像融合二.图像ROI区域定位三.图像属性(1)shape(2)size(3)dtype四.图像通道分离及合并(1)split()函数(2)merge()函数五.图像类型转换六.总结一.图像融合
目录
  • 一.图像融合
  • 二.图像ROI区域定位
  • 三.图像属性
    • (1)shape
    • (2)size
    • (3)dtype
  • 四.图像通道分离及合并
    • (1)split()函数
    • (2)merge()函数
  • 五.图像类型转换
    • 六.总结

      一.图像融合

      图像融合通常是指多张图像的信息进行融合,从而获得信息更丰富的结果,能够帮助人们观察或计算机处理。图5-1是将两张不清晰的图像融合得到更清晰的效果图。

      Python图像处理之图像融合与ROI区域绘制详解

      图像融合是在图像加法的基础上增加了系数和亮度调节量,它与图像的主要区别如下[1-3]:

      图像加法:目标图像 = 图像1 + 图像2

      图像融合:目标图像 = 图像1 × 系数1 + 图像2 × 系数2 + 亮度调节量

      在OpenCV中,图像融合主要调用addWeighted()函数实现,其原型如下。需要注意的是,两张融合图像的像素大小必须一致,参数gamma不能省略。

      dst = cv2.addWeighted(scr1, alpha, src2, beta, gamma)
      dst = src1 * alpha + src2 * beta + gamma
      

      下面的代码是将两张图片进行图像融合,两张图片的系数均为1。

      #coding:utf-8
      # By:Eastmount
      import cv2 
      import numpy as np 
      import matplotlib.pyplot as plt
      
      #读取图片
      src1 = cv2.imread('lena.png')
      src2 = cv2.imread('luo.png')
      
      #图像融合
      result = cv2.addWeighted(src1, 1, src2, 1, 0)
      
      #显示图像
      cv2.imshow("src1", src1)
      cv2.imshow("src2", src2)
      cv2.imshow("result", result)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      输出结果如图5-2所示,它将src1图像和src2图像按比例系数进行了融合,生成目标结果图result。

      Python图像处理之图像融合与ROI区域绘制详解

      同样可以设置不同的融合比例,图5-3是下面核心函数的效果图。

      cv2.addWeighted(src1, 0.6, src2, 0.8, 10)

      Python图像处理之图像融合与ROI区域绘制详解

      二.图像ROI区域定位

      ROI(Region of Interest)表示感兴趣区域,是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,被广泛应用于热点地图、人脸识别、图像分割等领域。如图5-4获取Lena图的脸部轮廓[4]。

      Python图像处理之图像融合与ROI区域绘制详解

      通过像素矩阵可以直接获取ROI区域,如img[200:400, 200:400]。下面的代码是获取脸部ROI区域并显示。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy as np
      
      #读取图片
      img = cv2.imread("lena.png")
      
      #定义200200矩阵 3对应BGR
      face = np.ones((200, 200, 3))
      
      #显示原始图像
      cv2.imshow("Demo", img)
      
      #显示ROI区域
      face = img[150:350, 150:350]
      cv2.imshow("face", face)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      输出结果如图5-5所示,它将Lena原图的脸部提取出来。

      Python图像处理之图像融合与ROI区域绘制详解

      同样,如果想将提取的ROI区域融合至其他图片,则使用赋值语句即可。下面代码是将提取的Lena头部轮廓融合至一幅新的图像中。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy as np
      
      #读取图片
      img = cv2.imread("Lena.png")
      test = cv2.imread("luo.png",)
      
      #定义150150矩阵 3对应BGR
      face = np.ones((150, 150, 3))
      
      #显示原始图像
      cv2.imshow("Demo", img)
      
      #显示ROI区域
      face = img[200:350, 200:350]
      test[250:400, 250:400] = face
      cv2.imshow("Result", test)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      运行结果如图5-6所示,它将提取的150×150脸部轮廓融合至新的图像[250:400, 250:400] 区域。

      Python图像处理之图像融合与ROI区域绘制详解

      三.图像属性

      前面一篇文章中我们已经看到了size、shape等关键字。这篇文章就对图像中最常见的三个属性进行介绍,它们分别是图像形状(shape)、像素大小(size)和图像类型(dtype)。

      (1)shape

      通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元组。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy
      
      #读取图片
      img = cv2.imread("luo.png")
      
      #获取图像形状
      print(img.shape)
      
      #显示zubvudS图像
      cv2.imshow("Demo", img)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      最终输出结果如图5-7所示,(412,412,3),它表示该图像共412行、412列像素,包括3个通道。

      Python图像处理之图像融合与ROI区域绘制详解

      (2)size

      通过size关键字获取图像的像素数目,其中灰度图像返回行数×列数,彩色图像返回行数×列数×通道数。下述代码就是获取“luo.png”图像的大小。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy
      
      #读取图片
      img = cv2.imread("luo.png")
      
      #获取图像形状
      print(img.shape)
      
      #获取像素数目
      print(img.size)

      输出结果如下所示,包含510468个像素,即为413×412×3。

      (412, 41编程客栈2, 3)

      509232

      (3)dtype

      通过dtype关键字获取图像的数据类型,通常返回uint8。

      # -*- coding:utf-8 -*-
      # By:Eashttp://www.cppcns.comtmount
      import cv2
      import numpy
      
      #读取图片
      img = cv2.imread("Lena.png")
      
      #获取图像形状
      print(img.shape)
      
      #获取像素数目
      print(img.size)
      
      #获取图像数据类型
      print(img.dtype)

      四.图像通道分离及合并

      OpenCV通过split()函数和merge()函数实现对图像通道的处理,包括通道分离和通道合并。

      (1)split()函数

      Ophttp://www.cppcns.comenCV读取的彩色图像由蓝色(B)、绿色(G)、红色(R)三原色组成,每一种颜色可以认为是一个通道分量[4],如图5-8所示。

      Python图像处理之图像融合与ROI区域绘制详解

      split()函数用于将一个多通道数组分量成三个单通道,其函数原型如下所示:

      mv = split(m[, mv])

      – m表示输入的多通道数组

      – mv表示输出的数组或vector容器

      下面的代码是获取彩色“小珞珞”图像三个颜色通道并分别显示。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy
      
      #读取图片
      img = cv2.imread("luo.png")
      
      #拆分通道
      b, g, r = cv2.split(img)
      
      #显示原始图像
      cv2.imshow("B", b)
      cv2.imshow("G", g)
      cv2.imshow("R", r)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      显示结果如图5-9所示,它展示了B、G、R三个通道的颜色分量。

      Python图像处理之图像融合与ROI区域绘制详解

      同时,可以获取不同通道颜色,核心代码为:

      • b = cv2.split(a)[0]
      • g = cv2.split(a)[1]
      • r = cv2.split(a)[2]

      (2)merge()函数

      该函数是split()函数的逆向操作,将多个数组合成一个通道的数组,从而实现图像通道的合并,其函数原型如下:

      dst = merge(mv[, dst])

      – mv表示输入的需要合并的数组,所有矩阵必须有相同的大小和深度

      – dst表示输出具有与mv相同大小和深度的数组

      实现图像三个颜色通道融合的代码如下:

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy as np
      
      #读取图片
      img = cv2.imread("luo.png")
      
      #拆分通道
      b, g, r = cv2.split(img)
      
      #合并通道
      m = cv2.merge([b, g, r])
      cv2.imshow("Merge", m)
           
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      显示结果如图5-10所示,它将拆分的B、G、R三个通道的颜色分量进行了合并,接着显示合并后的图像。

      Python图像处理之图像融合与ROI区域绘制详解

      同时,可以调用该函数提取图像的不同颜色,比如提取B颜色通道,G、B通道设置为0。代码如下所示:

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2
      import numpy as np
      
      #读取图片
      img = cv2.imread("luo.png")
      rows, cols, chn = img.shape
      
      #拆分通道
      b = cv2.split(img)[0]
      
      #设置g、r通道为0
      g = np.zeros((rows,cols), dtype=img.dtype)
      r = np.zeros((rows,cols), dtype=img.dtype)
      
      #合并通道
      m = cv2.merge([b, g, r])
      cv2.imshow("Merge", m)
           
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      此时显示的图像为蓝色通道,如图5-11所示,其他颜色的通道方法也类似。

      Python图像处理之图像融合与ROI区域绘制详解

      五.图像类型转换

      在日常生活中,我们看到的大多数彩色图像都是RGB类型,但是在图像处理过程中,常常需要用到灰度图像、二值图像、HSV、HSI等颜色。图像类型转换是指将一种类型转换为另一种类型,比如彩色图像转换为灰度图像、BGR图像转换为RGB图像。OpenCV提供了200多种不同类型之间的转换,其中最常用的包括3类,如下:

      • cv2.COLOR_BGR2GRAY
      • cv2.COLOR_BGR2RGB
      • cv2.COLOR_GRAY2BGR

      OpenCV提供了cvtColor()函数实现这些功能。其函数原型如下所示:

      dst = cv2.cvtColor(src, code[, dst[, dstCn]])

      – src表示输入图像,需要进行颜色空间变换的原图像

      – dst表示输出图像,其大小和深度与src一致

      – code表示转换的代码或标识

      – dstCn表示目标图像通道数,其值为0时,则有src和code决定

      该函数的作用是将一个图像从一个颜色空间转换到另一个颜色空间,其中,RGB是指Red、Green和Blue,一副图像由这三个通道(channel)构成;Gray表示只有灰度值一个通道;HSV包含Hue(色调)、Saturation(饱和度)和Value(亮度)三个通道。在OpenCV中,常见的颜色空间转换标识包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS[3]。

      下面是调用cvtColor()函数将图像进行灰度化处理的代码。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2 
      import numpy as np 
      import matplotlib.pyplot as plt
      
      #读取图片
      src = cv2.imread('luo.png')
      
      #图像类型转换
      result = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
      
      #显示图像
      cv2.imshow("src", src)
      cv2.imshow("result", result)
      
      #等待显示
      cv2.waitKey(0)
      cv2.destroyAllWindows()

      输出结果如图5-12所示,它将左边的彩色图像转换为右边的灰度图像,更多灰度转化算法将在后面的文章详细介绍。

      Python图像处理之图像融合与ROI区域绘制详解

      同样,可以调用下列核心代码将彩色图像转换为HSV颜色空间,如图5-13所示。

      grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

      Python图像处理之图像融合与ROI区域绘制详解

      下面代码对比了九种常见的颜色空间,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,并循环显示处理后的图像。

      # -*- coding:utf-8 -*-
      # By:Eastmount
      import cv2 
      import numpy as np 
      import matplotlib.pyplot as plt
      
      #读取原始图像
      img_BGR = cv2.imread('luo.png')
      
      #BGR转换为RGB
      img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
      
      #灰度化处理
      img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
      
      #BGR转HSV
      img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
      
      #BGR转YCrCb
      img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
      
      #BGRzubvudS转HLS
      img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
      
      #BGR转XYZ
      img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
      
      #BGR转LAB
      img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
      
      #BGR转YUV
      img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
      
      #调用matplotlib显示处理结果
      titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV'] 
      images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb,
           img_HLS, img_XYZ, img_LAB, img_YUV] 
      for i in range(9): 
       plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray') 
       plt.title(titles[i]) 
       plt.xticks([]),plt.yticks([]) 
      plt.show()

      其运行结果如图5-14所示:

      Python图像处理之图像融合与ROI区域绘制详解

      六.总结

      本章主要讲解python和OpenCV的图像基础处理,从读取显示图像到读取修改像素,从创建、复制、保存图像到获取图像属性合通道,再详细讲解了图像算数与逻辑运算,包括图像加法、减法、与运算、或运算、异或运算、非运算,最后讲解了图像融合和获取图像ROI区域及图像类型转换。本章知识为后续的图像处理、图像识别、图像变换打下扎实基础。

      以上就是Python图像处理之图像融合与ROI区域绘制详解的详细内容,更多关于Python图像处理的资料请关注我们其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号