文章目录
- 处理流程
- 颜色空间
- 二值图像
- 摄像头
python图像处理教程:初步📷插值变换📷形态学处理📷滤波
处理流程
opencv是跨平台图像处理库,为许多编程语言提供了接口,Python自然在列,但在使用pip安装时需要注意install的是【opencv-python】。
作为专业的图像处理库,opencv自然也提供了读取、处理、显示以及保存图片的全流程功能,其初步使用如下
import cv2path = 'lena.jpg'
img=cv2.imread(path)
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)cv2.imshow("img",img)
cv2.imshow("gray",img_gray)cv2.waitKey(0)
cv2.destroyAllWindows()
其中
- imread用于读取图片。
- cvtColor用于转换图片的色彩空间,【COLOR_RGB2GRAY】表示将RGB图像转换为灰度图像。
- imshow用于显示图片,其两个输入分别是窗口名称与将要显示的图像。
- waitKey 等待按下键盘,输入为等待时间,为0则表示不接受按键。
- destroyAllWindows 用于关闭所有窗口。
弹出窗口如下。
颜色空间
在opencv中,通过cvtColor函数可以完成色彩空间的转换,其输入参数分别是待转换图像和转换方法,其转换方法是已经整形常量,其变量名称类似于【RGBA2GRAY】,2即To,表示从一种颜色空间转向另一种。
GRAY即灰度图像,只有一个通道,除此之外,opencv还提供了许多种颜色空间,下面列举三种。
人类对颜色的感知,主要是通过红、绿、蓝这三种感光细胞实现的,正因如此,RGB格式的图像才如此普遍地被接受。如果再加上透明通道Alpha,则构成RGBA格式的图像。在opencv中,其通道顺序并不一定全都是红绿蓝,也可能是蓝绿红,即BGR。
但是,人类并不能感知不同颜色叠加前后的关联,即我们所认知的色彩并不能简单地被三原色直观地表示。为此出现了另一种颜色空间,即HSV,这三个字母分别表示色相、饱和度以及明度。
如果进一步研究人类对颜色的感知,可以将色彩空间分为两个相互正交的色调,即红绿色轴(a)和蓝黄轴(b),通过这两个通道就可以表示所有的颜色,再加上亮度值L,就构成了Lab色彩空间。
二值图像
从颜色空间的定义来说,黑白图像也应位列其中,只不过这个空间过于狭窄,只有黑白两个数值。而其转换方式也很简单,只需设置一个阈值 T T T,让像素灰度大于 T T T的置为白色,否则置为黑色,若 T T T不同,则转换结果不同。
由于多了一个参数,故而opencv并未将其作为一种转换类型,而是提供了另一个专用的二值化函数threshold,这个函数通过指定阈值和二值化类型,以实现从灰度图到二值图像的转换,当阈值不同时,lena图的二值化情况如下
bImgs = {}
for th in [50, 100, 150]:ret, bImg = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)bImgs[f"th={th}"] = bImgfor i,key in enumerate(bImgs,1):cv2.namedWindow(key, cv2.WINDOW_NORMAL)cv2.resizeWindow(key, 256, 256)cv2.moveWindow(key, 256*i, 300)cv2.imshow(key, bImgs[key])cv2.waitKey(0)
threshold的输入参数分别是灰度图像、阈值、默认值以及二值化类型,【THRESH_BINARY】表示,当灰度值小于阈值时置0,大于阈值时设为默认值,在本例中就是255。
此外,在打开多个窗口时,用到了resizeWindow和moveWindow来更改窗口尺寸以及移动窗口。
摄像头
除了打开图像文件之外,在opencv中还可以创建VideoCapture对象,可以读取摄像头。下面就打开电脑自带的相机,并将其影像二值化之后展示,效果如下
绘图代码如下。
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
flag = cap.isOpened()
index = 1
while (flag):ret, frame = cap.read()gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)ret, bImg = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY)cv2.imshow("camera", bImg)k = cv2.waitKey(1) & 0xFFif k == ord('s'):cv2.imwrite(f"{index}.jpg", bImg)print(f"save{index}.jpg successfuly!")index += 1elif k == ord('q'):breakcap.release()
cv2.destroyAllWindows()
其中,cap即为VideoCapture对象,cap.read用于读取当前帧,其返回值ret是一个成功判定符,frame即为抓取到的图像。在读取图像之后,将其转灰度,并进行二值化,最后在"camera"窗口中显示。
接下来捕捉按键,当检测到按下【s】时,调用imwrite保存图像;当检测到【q】时,退出窗口。