小白学OpenCV系列1-图像处理基本操作
由于工作需要,需要用到图像方面的知识技能,虽然在学校的时候学习过CS231N,但主要是深度学习方面,对于基础的图像原理没有做更多的了解。而后的工作中也一直没有接触图像相关的项目,因此此次也正好是个机会重新学习一下,并以此记录下我的学习过程。
既然要做图像相关的项目,怎么能绕开OpenCV呢?它是一个开源的计算机视觉库,最初由英特尔公司在1999年发起并开发,目的是为计算机视觉应用提供一套通用的基础工具。它功能很强大,几乎涵盖了计算机视觉的各个领域,同时可以在多种操作系统上运行,其核心代码使用 C/C++ 编写,但也提供了完善的Python接口(cv2模块),几乎成为了Python社区进行计算机视觉开发的首选库。
OpenCV安装
在Python环境下安装OpenCV非常简单,只需要运行以下命令即可:
pip install opencv-python
当前使用了Python3.9环境,OpenCV版本是4.12.0.88,安装完成后,导入cv2模块就可以用起来了。
图像处理基本操作
读取图像
在opencv里,可以使用imread函数来读取图像:
import cv2
retval = cv2.imread(file_name[, flags])
- retval是返回值,正常的话就是读取到的图像,如果未读取到,则返回None。
- file_name就是要读取的图像名。
- flags是控制读取文件的类型,具体的取值和含义如下所示:
显示图像
1、创建窗口
我们可以用下列函数来创建指定名称的窗口:
None = cv2.namedWindow(win_name)
- win_name是要创建的窗口的名称。
2、显示图像
None = cv2.imshow(win_name, image)
- win_name是窗口名称。
- image是图像。
这里的win_name可以是事先创建好的窗口名称(比如使用namedWindow创建的),也可以是一个不存在的窗口名称(该函数就会自动创建指定该名称的窗口)
按键等待
有时候我们需要让屏幕一直显示该窗口,因此需要用到下列函数:
retval = cv2.waitKey([delay])
- retval表示返回值。如果没有按键被按下,则返回-1;如果有按键被按下,则返回该按键的ASCII值。
- delay表示等待键盘触发的事件,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0。
如果不使用该函数,图像就会一闪即逝,不会一直显示。
销毁窗口
1、销毁指定窗口
我们可以用以下函数来销毁指定的窗口:
None = cv2.destroyWindow(win_name)
- win_name时窗口的名称
实际上该函数通常与cv2.waitKey()组合实现窗口的释放。
2、销毁所有窗口
有时候我们可能不止生成一个窗口,那么使用上个方法难免太麻烦了,因此可以使用下列函数,可以一次性销毁所有创建的窗口:
None = cv2.destroyAllWindows()
保存图像
当我们需要保存图像时,可以使用下列函数:
retval=cv2.imwrite(filename,img[,params])
- retval是返回值。如果保存成功,则返回逻辑值真,如果保存不成功,则返回逻辑值假。
- filename是要保存的文件完整路径名,包括扩展名。
- img是被保存的图像。
- params是保存类型参数,针对不同格式的图像,有很多选择,比如对于JPEG格式(后缀名为.jpg,.jpeg)的图像来说,有以下选项:
参数名 | 含义 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|
cv2.IMWRITE_JPEG_QUALITY | 设置JPEG的压缩质量 | 95 | 0-100 | 值越高图像质量越好,值越低压缩率越高 |
cv2.IMWRITE_JPEG_PROGRESSIVE | 启用/禁用渐进式 JPEG | 0 | 0是禁用,1是启用 | 渐进式 JPEG 在加载时从模糊到清晰逐步显示,适合网络传输 |
cv2.IMWRITE_JPEG_OPTIMIZE | 启用霍夫曼表优化 | 0 | 0是禁用,1是启用 | 通过优化霍夫曼编码表减小文件大小(不影响图像质量) |
cv2.IMWRITE_JPEG_RST_INTERVAL | 设置 JPEG 重启间隔 | 0 | 0-65535 | 设置重启间隔可增强错误恢复能力,适合不可靠传输环境 |
cv2.IMWRITE_JPEG_LUMA_QUALITY | 单独设置亮度(Y 通道)质量 | 0 | 0-100 | 需与 cv2.IMWRITE_JPEG_CHROMA_QUALITY 配合使用 |
cv2.IMWRITE_JPEG_CHROMA_QUALITY | 单独设置色度(Cb/Cr 通道)质量 | 0 | 0-100 | 人眼对色度变化不敏感,降低此值可显著减小文件大小 |
我们以下列图片来举例部分选项的使用:
import cv2
import osimage_path = os.path.abspath(r"fruits.jpg")
raw_save_path = r"fruit_raw.jpg"
huff_save_path = r"fruit_huff.jpg"
chroma_save_path = r"fruit_chroma.jpg"fruit_image = cv2.imread(image_path)
cv2.imshow("fruit", fruit_image)cv2.waitKey()
# 高质量保存
cv2.imwrite(raw_save_path, fruit_image, [cv2.IMWRITE_JPEG_QUALITY, 100])
# 霍夫曼优化保存
cv2.imwrite(huff_save_path, fruit_image, [cv2.IMWRITE_JPEG_OPTIMIZE, 1])
# 低色度保存
cv2.imwrite(chroma_save_path, fruit_image, [cv2.IMWRITE_JPEG_LUMA_QUALITY, 100, cv2.IMWRITE_JPEG_CHROMA_QUALITY, 50])
cv2.destroyAllWindows()
cv2.IMWRITE_JPEG_QUALITY的保存效果如下:
cv2.IMWRITE_JPEG_OPTIMIZE的保存效果如下:
cv2.IMWRITE_JPEG_LUMA_QUALITY和cv2.IMWRITE_JPEG_CHROMA_QUALITY的保存效果如下:
实际上看上去没有太大的差别,但是各自存储的大小还是有所差异的。
高质量 | 霍夫曼优化 | 低色度 |
---|---|---|
161kb | 82.1kb | 117kb |
使用另外两种方法保存,占用的存储空间小很多。
总结
本篇文章主要介绍了Python环境中OpenCV模块的安装,以及几个简单方法的使用:
- cv2.imread:读取图像
- cv2.namedWindow:创建窗口
- cv2.imshow:显示图像
- cv2.waitKey:等待按键输入
- cv2.destroyWindow:销毁指定名字的窗口
- cv2.destroyAllWindows:销毁所有创建的窗口
- cv2.imwrite:保存图像
后续将逐步使用此模块搭建一些实用工具,只有理论和实践相结合才能更深刻地理解背后的奥秘。