OpenCV之图像处理基础
点击下方 卡片 ,关注“ 新机器视觉 ”公众号
重磅干货,第一时间送达
这篇文章介绍图像的基本表示方法、像素的访问和操作、感兴趣区域处理、通道处理等知识点。需要说明的是,在使用面向python的OpenCV必须熟练掌握Numpy库,尤其是Numpy.array库是python处理图像的基础。
图像的基本表示方法
这里只讨论二值图像、灰度图像、彩色图像的基本表示方法。
二值图像
二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,将白色像素点处理为“1”,将黑色像素点处理为“0”,以方便进行后续的存储和处理等操作。由于图像只有黑色和白色两种不同的颜色,因此只使用一个比特位就能表示。
灰度图像
由于二值图像表示简单,只有黑色和白色两种颜色,所以表示的图像不够细腻。通常在计算机中,会将灰度处理为256个灰度级,用数值区间[0,255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白色到纯黑之间不同级别的灰度。0~255个灰度级的数值,可以用一个八位二进制表示(一个字节)。
彩色图像
相比于二值图像和灰度图像,彩色图像识更常见的一类图像,它能表现更丰富的细节信息。彩色图像是建立在一个RGB色彩空间中的,R--red,红色;G--green,绿色;B--blue,蓝色;一共三个通道,且每个通道的范围都在[0,255]之间。
一般情况下,在RGB色彩空间中,图像通道的顺序是R-G-B,即第一通道式R,红色,第二个通道是G,绿色,第三个通道是B,蓝色。然而在OpenCV中通道的顺序是B-G-R,即蓝色--绿色--红色。
像素处理
像素是图像构成的基本单元,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内得元素进行访问、处理。
二值图像及灰度图像
在OpenCV中最小的数据类型时无符号的8位数。因此,在OpenCV中实际上没有二值图像这种数据类型,二值图像经常是通过处理得到的,使用0表示黑色,使用255表示白色。可以理解为一种特殊的灰度图像。
彩色图像
RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以单位储存在ndarray的列中。
使用numpy.array访问像素
numpy.array提供了item()和itemset()函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。唉访问及修改像素点值时,利用numpy.array提供的函数比直接使用索引要快得多,同时,他们也有更好的可读性。
二值图像及灰度图像
可以将二值图像理解为特殊的灰度图像,所以这里仅以灰度图像为例讨论像素点值得读取和修改。
函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:item(行,列)
函数itemset()可以用来修改像素值,其语法格式为:itemset(索引值,新值)
其中索引值是一个元组——(行,列)
彩色图像
我们可以使用item()和函数itemset()来访问和修改彩色图像的像素值,过程与操作灰度图像相似,不同之处在于需要补充通道信息。item(行,列,通道)
itemset(三元组索引值,新值)
注意:针对RGB图像的访问,必须必须同时指定行、列以及索引通道。仅仅指定行和列是不可以的。
感兴趣区域ROI
在图像处理过程中,我们可能会对图像某个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。在设定感兴趣区域ROI后,就可以对该区域进行整体操作。例如进行赋值,复制。
ROI表达式如下:img[200:400,200:400]
通道操作
拆分通道
通过索引拆分通道
通过索引的方式,可以直接将各个通道从图像内提取出来。例如,针对OpenCV内的BGR图像img,如下语句分别从中提取了B通道、G通道、R通道。
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
通过函数拆分
函数cv2.split()
能够拆分图像的通道。例如,可以通过如下语句拆分彩色BGR图像img,得到B通道图像b、G通道g和R通道图像r
b = cv2.split(a)[0]
g = cv2.split(a)[1]
r = cv2.split(a)[2]
通道合并
通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge
可以实现图像通道合并,例如将有B通道图像b、G通道图像g和R通道图像r,使用函数cv2.merge()
可以将三个通道合并为一幅BGR的三通道彩色图像。其语句为:brg = cv2.merge([b,g,r])
获取图像属性
在图像处理过程中,经常需要获取图像的属性,例如图像的大小、类型等。这里介绍几个常用的属性。
-
shape: 如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像识灰度图像(或二值图像)还是彩色图像。
-
size: 返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
-
dtype: 返回图像的数据类型。
如下例,提取一幅图像内得肤色部分:
import cv2
img = cv2.imread("lesson2.jpg")
hav = cv2.cvtColor( img, cv2.COLOR_BGR2HSV )
h , s, v, = cv2.split(hsv)
minHue = 5
maxHue = 170
hueMask = cv2.inRange(h, minHue, maxHue)
minSat = 25
maxSat = 166
satMask = cv2.inRange( s, minSat, maxSat)
mask = hueMask & satMask
roi = cv2.bitwise_and( img, img, mask= mask)
cv2.imshow("img",img)
cv2.imshow("ROI",roi)
cv2.waitKey()
cv2.destroyALLWindows()
声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。
—THE END—