目录
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)共 512512
3=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