数字图像处理(7): 获取图像属性、感兴趣区域(ROI) 和 通道拆分与合并 |
您所在的位置:网站首页 › 图片饱和度高什么意思 › 数字图像处理(7): 获取图像属性、感兴趣区域(ROI) 和 通道拆分与合并 |
目录 1 获取图像的属性 1.1 形状- shape 1.2 像素数目- size 1.3 图像类型- dtype 2 获取图像的感兴趣区域(ROI) 3 图像的通道拆分与合并 3.1 通道拆分- split() 3.2 通道合并- merge() 参考资料 1 获取图像的属性图像的属性有: (1)形状:行、列 和 通道数量; (2)像素数量; (3)图像的数据类型。 1.1 形状- shape 通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中: (1)灰度图像返回行数和列数; (2)彩色图像返回行数、列数 和 通道数。 例子如下图所示:
代码如下: # -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()运行结果:(该图像为512行像素、512列像素、3个通道)
1.2 像素数目- size 通过size关键字获取图像的像素数目,其中 (1)灰度图像返回 [行数 (2)彩色图像返回 [行数 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size)
运行结果如下图所示:(512,512,3)共 512
1.3 图像类型- dtype 通过 dtype 关键字获取图像的数据类型,通常返回uint8。 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size) #获取图像类型 print(img.dtype)
运行结果如下:
2 获取图像的感兴趣区域(ROI) ROI (Region of Interest) 表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator) 和函数求得感兴趣ROI,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。
通过像素矩阵可以直接获取ROI区域,如img[200:400, 200:400]。
代码示例: # -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) #定义200*100矩阵 3对应BGR face = np.ones((200, 150, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[200:400, 200:350] cv2.imshow("face", face) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下:
下面将提取的ROI图像 进行覆盖到原图的某个位置(就是修改原图位置的像素值)。 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) #定义200*100矩阵 3对应BGR face = np.ones((200, 150, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[200:400, 200:350] #ROI图像 覆盖到原图的某个区域 img[0:200,0:150] = face cv2.imshow("face", face) #显示修改后的原始图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下: 3 图像的通道拆分与合并 3.1 通道拆分- split() OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。 b = img[:, :, 0] g = img[:, :, 1] r = img[:, :, 2] 注意OpenCV与Matlab的区别:Matlab的第一个通道是从1开始的,OpenCV是从0开始的。
上面的方式,在之前已经用过了,这里用 split() 函数函数来拆分RGB图像的三个通道。
代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) # 拆分通道 b, g, r = cv2.split(img) # 显示原始图像 cv2.imshow("B", b) cv2.imshow("G", g) cv2.imshow("R", r) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()运行结果如下:
当然也可以获取不同的通道,例如: b = cv2.split(img)[0] g = cv2.split(img)[1] r = cv2.split(img)[2] 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) # 拆分通道 b = cv2.split(img)[0] # 显示原始图像 cv2.imshow("B", b) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下:
3.2 通道合并- merge() 图像通道合并主要使用 merge() 函数实现。例如: m = cv2.merge([b, g, r])
代码如下:(先拆分RGB通道,再合并RGB通道) # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) # 拆分通道 b, g, r = cv2.split(img) # 合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下:
注: 因为OpenCV是BRG通道,现在将其通道弄反,确认一下,OpenCV是不是按BRG通道组成的。
代码如下:(仅修改了,合并通道时候,使用RGB合成的) # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) # 拆分通道 b, g, r = cv2.split(img) # 合并通道 m = cv2.merge([r, g, b]) cv2.imshow("Merge", m) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下:(由结果可以看出,OpenCV确实是按BRG通道组成的,哈哈还是很好玩的)
(1)同时,可以提取图像的不同颜色,提取 B 颜色通道,而G、R通道像素值均设置为0,则显示蓝色。 代码如下所示: # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape # 拆分通道 b = cv2.split(img)[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()
运行结果如下所示:
(2)提取 G 颜色通道,而B、R通道像素值均设置为0,则显示绿色。 代码如下所示: # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape # 拆分通道 g = cv2.split(img)[1] b = 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()
运行结果如下所示:
(3)提取 R 颜色通道,而B、G通道像素值均设置为0,则显示红色。 代码如下所示: # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("lena.tiff", cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape # 拆分通道 r = cv2.split(img)[2] b = np.zeros((rows, cols), dtype=img.dtype) g = np.zeros((rows, cols), dtype=img.dtype) # 合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下所示: 参考资料 [1] https://blog.csdn.net/eastmount/article/details/82177300 [2] Python+OpenCV图像处理 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |