1、获取图像属性
我们常用的图像属性主要包括图像的宽和高、像素的数目和数据类型等。相关代码如下:
import cv2
img = cv2.imread('F:\python\work\cv_learn\lena.jpg',1)#读取图像
print(img.shape)#获取图像的宽、高
print(img.size)#获取图像像素数目
print(img.dtype)#返回数据类型
运行结果如下:
可见由于读取的是RGB类型的彩色图像,img.shape返回的也是图像的宽、高和通道数。要注意的是像素的数目也是横向*纵向*通道数,所以要获得真正的数目应该再除以通道数。
2.获取图像的ROI(range of interest)
获取图像ROI的过程类似于python中对数组进行切片,代码实现如下:
import cv2
img = cv2.imread('F:\python\work\cv_learn\lena.jpg',1)#读取图像
roi = img[100:300,100:300]
cv2.imshow('roi',roi)#显示roi区域
cv2.imshow('source',img)#显示图像
cv2.waitKey(0)#保持图像
运行结果如图:
要注意的是opencv中图像的存储格式是一个三维数组,层次为 [行,列,通道],但是python中三维数组存储的顺序却是 [通道,行,列],所以我们输出一个彩色图像12个像素点的值时显示的是这样的:
可见显示的分别是B,G,R三个通道的像素值,如果我们取某一点,例如第一个点,他的像素值应该为[78,95,73],三维数组的概念比较抽象,这里要好好理解。但是如果我们想通过python来显示三维数组的第二层第一行第零列的像素,我们应该打印img[2,1,0](顺序为层数、行、列),而不是打印img[1,0,2]。
3.通道的拆分与合并
例如我们读取的是一个RGB彩色的图像,我们通过
b,g,r = cv2.split(img)
cv2.imshow('b',b)#显示图像
cv2.imshow('g',g)#显示图像
cv2.imshow('r',r)#显示图像
来实现,效果如下:
合成的时候一定要注意顺序,前面的博文中强调过我们常说的RGB格式在opencv中存储的顺序其实是B,G,R,我们通过下列代码实现:
img2 = cv2.merge([b,g,r])
效果如上,左图是按照RGB这种错误的格式合成的,右图则是按照BGR正确的格式合成的。
最后,我也是刚入门opencv,可能还会有很多不对的地方,欢迎大家指正!