数字图像处理(7): 获取图像属性、感兴趣区域(ROI) 和 通道拆分与合并

您所在的位置:网站首页 图片饱和度高什么意思 数字图像处理(7): 获取图像属性、感兴趣区域(ROI) 和 通道拆分与合并

数字图像处理(7): 获取图像属性、感兴趣区域(ROI) 和 通道拆分与合并

2024-07-17 15:48| 来源: 网络整理| 查看: 265

目录

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)灰度图像返回 [行数 \times 列数]  ;

(2)彩色图像返回 [行数 \times 列数 \times 通道数] 。

代码如下:

# -*- 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\times512\times3=786432个像素

 

 

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