1、获取图像属性

    我们常用的图像属性主要包括图像的宽和高、像素的数目和数据类型等。相关代码如下:

import cv2

img = cv2.imread('F:\python\work\cv_learn\lena.jpg',1)#读取图像
print(img.shape)#获取图像的宽、高
print(img.size)#获取图像像素数目
print(img.dtype)#返回数据类型

运行结果如下:

                            

imdecode python 读取4通道图像文件 python获取图像通道_显示图像

可见由于读取的是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)#保持图像

运行结果如图:

                              

imdecode python 读取4通道图像文件 python获取图像通道_python_02

要注意的是opencv中图像的存储格式是一个三维数组,层次为 [行,列,通道],但是python中三维数组存储的顺序却是 [通道,行,列],所以我们输出一个彩色图像12个像素点的值时显示的是这样的:

                                                               

imdecode python 读取4通道图像文件 python获取图像通道_显示图像_03

可见显示的分别是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)#显示图像

来实现,效果如下:

                

imdecode python 读取4通道图像文件 python获取图像通道_python_04

合成的时候一定要注意顺序,前面的博文中强调过我们常说的RGB格式在opencv中存储的顺序其实是B,G,R,我们通过下列代码实现:

img2 = cv2.merge([b,g,r])

                         

imdecode python 读取4通道图像文件 python获取图像通道_三维数组_05

imdecode python 读取4通道图像文件 python获取图像通道_python_06

效果如上,左图是按照RGB这种错误的格式合成的,右图则是按照BGR正确的格式合成的。

最后,我也是刚入门opencv,可能还会有很多不对的地方,欢迎大家指正!