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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zaishuiyifangxym/article/details/89530699

目录

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图像处理

猜你喜欢

转载自blog.csdn.net/zaishuiyifangxym/article/details/89530699
今日推荐