Python OpenCV基础:图像读取、显示与保存详解
本文详解Python OpenCV中图像读取、显示及保存的核心函数。重点解析cv2.imread的三种加载模式、cv2.imshow与waitKey的配合机制,以及cv2.imwrite中针对JPEG质量与PNG压缩级别的参数设置,附带图像翻转、通道转换及ROI裁剪示例,帮助开发者快速掌握基础操作。
为什么使用Python-OpenCV?
尽管Python拥有强大的功能及其自带的PIL图像处理库,但在处理复杂算法时,OpenCV的表现更为出色。OpenCV提供了完善的Python接口,调用便捷。目前OpenCV最新版本为4.0,内置超过2500种算法和函数,几乎覆盖了所有成熟的图像处理需求,极大地简化了开发流程。
基本操作
1、图像读入
通过调用cv2.imread(filepath, flags)函数来加载图像。该图像文件需位于程序的工作目录中,或者需要提供完整的绝对路径。第二个参数flags用于指定读取图像的方式,此参数为可选。
参数说明:filepath代表待读取图片的完整路径;flags为控制图像读取方式的标志位。
- cv2.IMREAD_COLOR:默认选项,以彩色模式读取图像,自动忽略Alpha通道。
- cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。
- cv2.IMREAD_UNCHANGED:完整读取图像,包括Alpha通道信息。
import cv2
import numpy as np
img = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)
2、显示图片
使用cv2.imshow(wname, img)函数展示图像。第一个参数wname指定窗口标题,第二个参数img为通过imread加载的图像对象,窗口大小会自动适配图像尺寸。
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() #cv2.destroyWindow(wname)
- cv2.waitKey()用于等待键盘输入,单位毫秒。它指定程序等待按键的时间,若在指定时间内按下任意键,则返回该键的ASCII码并继续执行;若超时未按键,则返回-1。设置参数为0表示无限等待。若不调用此函数,窗口将瞬间关闭,无法观察到图像显示效果。
- cv2.destroyAllWindow()用于销毁所有打开的窗口。
- cv2.destroyWindow(wname)用于销毁指定名称的窗口。
3、保存图片
使用cv2.imwrite(file, img, num)保存图像。第一个参数file为保存的文件名,第二个参数img为待保存的图像对象。第三个参数num为可选参数,针对特定格式设置属性:对于JPEG格式,该值表示图像质量,取值范围为0-100的整数,默认值为95;对于PNG格式,该值表示压缩级别,默认值为3。
注意:
- cv2.IMWRITE_JPEG_QUALITY的数据类型为long,在传递时必须转换为int类型。
- cv2.IMWRITE_PNG_COMPRESSION的取值范围为0到9,数值越高,图像文件体积越小。
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
变换操作
1、翻转图片
使用cv2.flip(img, flipcode)函数对图像进行翻转,flipcode参数控制翻转的具体效果。
- flipcode = 0:沿x轴进行水平翻转。
- flipcode > 0:沿y轴进行垂直翻转。
- flipcode < 0:同时沿x轴和y轴进行翻转。
imgflip = cv2.flip(img,1)
2、复制图片
imgcopy = img.copy()
3、颜色空间转换
需注意,Matplotlib库中图像的通道顺序为RGB,而OpenCV中图像的通道顺序为BGR。因此在结合两者进行显示时,必须注意交换通道顺序以避免颜色失真。
彩色图像转为灰度图像
img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
灰度图像转为彩色图像
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
4、裁剪图片
裁剪感兴趣区域(ROI, Region of Interest)可利用NumPy的切片功能实现,因为OpenCV中的图像数据本质上是存储在numpy.ndarray对象中。
可通过image.shape属性查看图像的行列数及通道信息。
print(image.shape)
例如,若返回值为(708, 1000, 4),则分别代表图像的高度为708像素,宽度为1000像素,通道数为4。
对图片的裁剪本质上就是数组切片操作,例如:
#得到区域高100~800步长为2,宽200~600步长为1, 通道0
image2 = image[100:800:2, 20:600:1, 0]
#得到原图,通道2
image3 = image[:, :, 2]
综合示例
读取一张图片并显示,用户可通过按键选择退出程序或保存处理后的图像。
import cv2
import numpy as np
img = cv2.imread('a.jpg')
cv2.imshow('image',img)
# Wait for keys to exit or save
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('save_image.jpg', img)
cv2.destroyAllWindows()
ord('s')用于获取字符's'的ASCII码值,而ASCII值27对应的是'Esc'键。
参考链接:
1、https://blog.csdn.net/fu6543210/article/details/80835280
2、http://www.runoob.com/python/python-func-ord.html
到此这篇关于Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()的区别的文章就介绍到这了,更多相关OpenCV cv2.imread(),cv2.imshow(),cv2.imwrite()内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









