图像roi区域提取方法,

  图像roi区域提取方法,

  本文将详细讲解图像融合处理和ROI区域渲染,并补充图像属性、通道和类型转换。本文中的示例代码解释的很详细,有需要的可以参考一下。

  00-1010一、图像融合二。图像ROI区域定位。图像属性(1)形状(2)大小(3)数据类型IV。图像通道分离与合并(1)split()函数(2)merge()函数五、图像类型转换六。摘要

  

目录

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

  图像融合是基于通过添加系数和亮度等级的图像相加。图像融合和图像融合的主要区别如下[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。

  #编码:utf-8

  # By:伊斯特蒙特

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为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 ,结果)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  输出如图5-2所示,根据比例系数融合src1图像和src2图像,生成目标结果图结果。

  您还可以设置不同的融合比率。图5-3是以下核心功能的效果图。

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

  

一.图像融合

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

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

  # -*-编码:utf-8 -*-

  # By:伊斯特蒙特

  导入cv2

  将numpy作为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原图的脸部提取出来。

  

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

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  #读取图片

  img = cv2.imread("Lena.png")

  test = cv2.imread("luo.png",)

  #定义150×150矩阵 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] 区域。

  

  

  

三.图像属性

  前面一篇文章中我们已经看到了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)

  #显示图像

  cv2.imshow("Demo", img)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

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

  

  

  

(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, 412, 3)

  509232

  

  

  

(3)dtype

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

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy

  #读取图片

  img = cv2.imread("Lena.png")

  #获取图像形状

  print(img.shape)

  #获取像素数目

  print(img.size)

  #获取图像数据类型

  print(img.dtype)

  

  

四.图像通道分离及合并

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

  

  

(1)split()函数

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

  

  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三个通道的颜色分量。

  

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

  

  • 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三个通道的颜色分量进行了合并,接着显示合并后的图像。

  

  同时,可以调用该函数提取图像的不同颜色,比如提取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所示,其他颜色的通道方法也类似。

  

  

  

五.图像类型转换

  在日常生活中,我们看到的大多数彩色图像都是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所示,它将左边的彩色图像转换为右边的灰度图像,更多灰度转化算法将在后面的文章详细介绍。

  

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

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

  

  下面代码对比了九种常见的颜色空间,包括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)

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

  以上就是Python图像处理之图像融合与ROI区域绘制详解的详细内容,更多关于Python图像处理的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: