《OpenCV轻松入门:面向Python》学习笔记(一)
一. OpenCV入门
1.1 读取图像
retval = cv2.imread( filename[, flags] )
- retval 是返回值,其值是读取到的图像。如果未读取到图像,则返回“None”。
- filename 表示要读取的图像的完整文件名。
- flags 是读取标记。该标记用来控制读取文件的类型,具体如表1-1 所示。表1-1 中的第一列参数与第三列数值是等价的。例如cv2.IMREAD_UNCHANGED=−1,在设置参数时,既可以使用第一列的参数值,也可以采用第三列的数值。
1.2 显示图像
1.2.1 cv2.imshow( winname, mat )
- winname 是窗口名称。
- mat 是要显示的图像。
1.2.2 retval = cv2.waitKey( [delay] )
- retval 表示返回值。如果没有按键被按下,则返回−1;如果有按键被按下,则返回该按键的ASCII码。
- delay 表示等待键盘触发的时间,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0。
在实际使用中,可以通过函数cv2.waitKey()获取按下的按键,并针对不同的键做出不同的反应,从而实现交互功能。例如,如果按下A 键,则关闭窗口;如果按下B 键,则生成一个窗口副本。
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo", lena )
key=cv2.waitKey()
if key==ord('A'):
cv2.imshow("PressA",lena)
elif key==ord('B'):
cv2.imshow("PressB",lena)
1.2.3 cv2.destroyWindow( winname )
- winname是窗口名称。
在实际使用中,该函数通常与函数cv2.waitKey()组合实现窗口的释放。
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo", lena )
cv2.waitKey()
cv2.destroyWindow("demo")
1.2.4 cv2.destroyAllWindows( )
- 用于释放(销毁)所有窗口。
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo1", lena )
cv2.imshow("demo2", lena )
cv2.waitKey()
cv2.destroyAllWindows()
1.3 保存图像
retval = cv2.imwrite( filename, img[, params] )
- retval 是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
- filename 是要保存的目标文件的完整路径名,包含文件扩展名。
- img 是被保存图像的名称。
- params 是保存类型参数,是可选的。
二. 图像处理基础
2.1 图像基本表示方法
2.1.1 二值图像
二值图像是指仅仅包含黑色(0)和白色(1)两种颜色的图像。
2.1.2 灰度图像
通常,计算机会将灰度处理为256 个灰度级,用数值区间[0, 255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白到纯黑之间不同级别的灰度。
2.1.3 RBG彩色图像
在 RGB色彩空间中,存在R(red,红色)通道、G(green,绿色)通道和B(blue,蓝色)通道,共三个通道。每个色彩通道值的范围都在[0, 255]之间,我们用这三个色彩通道的组合表示颜色。
一般情况下,在RGB色彩空间中,图像通道的顺序是R→G→B,即第1个通道是R 通道,第2个通道是G 通道,第3个通道是B 通道。需要特别注意的是,在OpenCV 中,通道的顺序是B→G→R。
2.2 像素处理
2.2.1 二值图像与灰度图像
在OpenCV 中,最小的数据类型是无符号的8位数。因此,在OpenCV 中实际上并没有二值图像这种数据类型,二值图像经常是通过处理得到的,然后使用0表示黑色,使用255表示白色。
在面向Python 的OpenCV中,图像就是Numpy库中的数组。一个OpenCV 灰度图像是一个二维数组,可以使用表达式访问其中的像素值。例如,可以使用image[0,0]
访问图像image 第0行第0列位置上的像素点。第0行第0列位于图像的左上角,其中第1 个索引表示第0行,第2个索引表示第0列。
2.2.2 彩色图像
RGB 模式的彩色图像在读入OpenCV 内进行处理时,会按照行方向依次读取该RGB 图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray 的列中。
可以使用表达式访问数组内的值。例如,可以使用image[0,0,0]
访问图像image的B通道的第0行第0列上的像素点,式中:
- 第 1 个索引表示第0 行。
- 第 2 个索引表示第0 列。
- 第 3 个索引表示第0 个颜色通道。
#例:使用Numpy 生成一个三维数组,用来观察三个通道值的变化情况
import numpy as np
import cv2
img=np.zeros((300,300,3),dtype=np.uint8)
img[:,0:100,0]=255
img[:,100:200,1]=255
img[:,200:300,2]=255
print("img=\n",img)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
2.3 使用numpy.array访问像素
2.3.1 img.item(行,列[,通道])
- 访问图像img的像素值。
- img为二值或灰度图时不需要通道参数,为彩色图的时候需要通道参数。
2.3.2 itemset((行,列[,通道]),新值)
- 修改图像的像素值。
- img为二值或灰度图时元组索引值内为行和列两个元素,为彩色图的时候为行、列和通道三个参数。
2.4 通道操作
2.4.1 b,g,r=cv2.split(img)
- 拆分出图像的rgb值。
2.4.2 bgr=cv2.merge([b,g,r])
- 将三个通道的灰度图像构成一幅彩色图像。
2.5 获取图像属性
2.5.1 img.shape
如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。
2.5.2 img.size
返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
2.5.3 img.dtype
返回图像的数据类型。