目标
- 读图片
- 显示图片
- 保存图片
代码
## 导入库
import cv2
import sys
## 读入图片
img = cv2.imread("lena.jpg")
## 读入失败退出
if img is None:
sys.exit("Could not read the image.")
## 显示图片
cv2.imshow("Display window", img)
k = cv2.waitKey(0)
## 等待按键,如果是 s 则退出
if k == ord("s"):
cv2.imwrite("lena-back.jpg", img)
## 销毁所有窗口
cv2.destroyAllWindows()
imread
从文件中读入图片,并返回图片,如果读入失败(文件不存在或者格式不支持),则返回空。
接口
原型
Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)
cv2.imread(filename[, flags]) -> retval
参数
filename: 文件名
flags: 读取模式
支持的格式
支持的格式如下
- *.bmp, *.dib - Windows bitmaps (总是支持)
- *jpeg, *.jpg, *.jpe - JPEG files (看备注)
- *.jp2 - JPEG 2000 files (看备注)
- *.png - Portable Network Graphics ( 看备注)
- *.webp - WebP ( 看备注)
- *.pbm, *.pgm, *.ppm *.pxm, *.pnm - Portable image format (总是支持)
- *.pfm - PFM files ( 看备注)
- *.sr, *.ras - Sun rasters (总是支持)
- *.tiff, *.tif - TIFF files ( 看备注)
- *.exr - OpenEXR Image files ( 看备注)
- *.hdr, *.pic - Radiance HDR (总是支持)
- Raster and Vector geospatial data supported by GDAL ( 看备注)
备注
- 不是根据文件后缀确定的,而是根据文件内容确定的。
- 彩色图像,解码后以
B-G-R
通道顺序存放数据。- 当用
IMREAD_GRAYSCALE
格式读取时,会用到内部的灰度解码,结果可能与cvtColor()
有些不同。- 在
Windows
和MacOSX
上,默认使用OpenCV
附带的解码器(libjpeg, libpng, libtiff, libjasper
)。因此OpenCV
始终可以读取JPEG、PNG和TIFF
;在MacOSX
上,也可以使用MacOSX
的图像读取器,但是要当心由于MacOSX
附带了颜色管理,可能导致读取的像素值不一样。- 在
Linux*、BSD
风格和其他类似Unix
的开源操作系统上,OpenCV寻找系统提供的解码器,需要安装相关的包(不要忘记开发文件,例如:libjpeg-dev
等)从而可以获得解码支持或者打开CMakeLists
里的开关OPENCV_BUILD_3RDPARTY_LIBS
。- 在
CMakeLists
里设置WITH_GDAL
开关为true
就可以使用IMREAD_LOAD_GDAL
加载图像,GDAL
驱动就可以使用从而可以解码图像,支持Raster
和Vector
。- 如果
EXIF
信息嵌入到图像中,EXIF
的方向信息会被考虑并且会根据其旋转,除非设置IMREAD_IGNORE_ORIENTATION
或者IMREAD_UNCHANGED
。- 使用 IMREAD_UNCHANGED 可以保留 PFM 图像的浮点值。
读图像模式 | 描述 |
---|---|
IMREAD_UNCHANGED Python: cv2.IMREAD_UNCHANGED | 加载原本的图像,忽略EXIF的方向 |
IMREADGRAYSCALE Python: cv2.IMREAD_GRAYSCALE | 内部解码为灰度图像 |
IMREADCOLOR Python: cv2.IMREAD_COLOR | 总是将图像转换为BGR图像 |
IMREADANYDEPTH Python: cv2.IMREAD_ANYDEPTH | 如果是32位/32位图像,则返回16位/32位图像,否则转换为8位图像 |
IMREADANYCOLOR Python: cv2.IMREAD_ANYCOLOR | 任意可能的颜色格式 |
IMREADLOAD_GDAL Python: cv2.IMREAD_LOAD_GDAL | GADL驱动加载图像 |
IMREADREDUCED_GRAYSCALE_2 Python: cv2.IMREAD_REDUCED_GRAYSCALE_2 | 总是转换为单通道灰度图像,并缩放为1/2 |
IMREADREDUCED_COLOR_2 Python: cv2.IMREAD_REDUCED_COLOR_2 | 总是转换为BGR图像,并缩放到1/2 |
IMREADREDUCED_GRAYSCALE_4 Python: cv2.IMREAD_REDUCED_GRAYSCALE_4 | 总是转换为单通道灰度图像,并缩放到1/4 |
IMREADREDUCED_COLOR_4 Python: cv2.IMREAD_REDUCED_COLOR_4 | 总是转换为BGR图像,并缩放到1/4 |
IMREADREDUCED_GRAYSCALE_8 Python: cv2.IMREAD_REDUCED_GRAYSCALE_8 | 总是将图像转换为单通道灰度图像,并缩放到1/8 |
IMREADREDUCED_COLOR_8 Python: cv2.IMREAD_REDUCED_COLOR_8 | 总是将图像转换为BGR图像,并缩放到1/8 |
IMREADIGNORE_ORIENTATION Python: cv2.IMREAD_IGNORE_ORIENTATION | 根据EXIF的方向标志,不旋转图像 |
imwrite
接口
原型
bool cv::imwrite(const String & filename,
InputArray img,
const std::vector< int > & params = std::vector< int >()
)
cv2.imwrite(filename, img[, params]) -> retval
参数
文件名: 文件名
图像: 需要保存的图像 Mat
参数: 特殊编码格式
写图像标志 | 描述 |
---|---|
IMWRITE_JPEG_QUALITY Python: cv2.IMWRITE_JPEG_QUALITY | JPEG,压缩质量0~100,默认95 |
IMWRITE_JPEG_PROGRESSIVE Python: cv2.IMWRITE_JPEG_PROGRESSIVE | 使能JPEG,0或1,默认为False |
IMWRITE_JPEG_OPTIMIZE Python: cv2.IMWRITE_JPEG_OPTIMIZE | 使能JPEG特性,0或1,默认为False |
IMWRITE_JPEG_RST_INTERVAL Python: cv2.IMWRITE_JPEG_RST_INTERVAL | JPEG重启间隔,0~65535, 默认为0,不重启 |
IMWRITE_JPEG_LUMA_QUALITY Python: cv2.IMWRITE_JPEG_LUMA_QUALITY | 单独亮度质量等级,0~100,默认为0,不用 |
IMWRITE_JPEG_CHROMA_QUALITY Python: cv2.IMWRITE_JPEG_CHROMA_QUALITY | 单独色度质量等级,0~100,默认为0,不用 |
IMWRITE_PNG_COMPRESSION Python: cv2.IMWRITE_PNG_COMPRESSION | PNG图像,压缩等级0~9,值越高,压缩越厉害,图像尺寸越小,压缩时间越长,默认为1,最佳速度设置 |
IMWRITE_PNG_STRATEGY Python: cv2.IMWRITE_PNG_STRATEGY | One ofcv::ImwritePNGFlags, 默认为IMWRITE_PNG_STRATEGY_RLE. |
IMWRITE_PNG_BILEVEL Python: cv2.IMWRITE_PNG_BILEVEL | 二值等级,0或1,默认为0 |
IMWRITE_PXM_BINARY Python: cv2.IMWRITE_PXM_BINARY | PPM,PGM,PBM图像,0或1,默认为1 |
IMWRITE_EXR_TYPE Python: cv2.IMWRITE_EXR_TYPE | |
IMWRITE_EXR_COMPRESSION Python: cv2.IMWRITE_EXR_COMPRESSION | 覆盖EXR存储类型,默认FP32 |
IMWRITE_WEBP_QUALITY Python: cv2.IMWRITE_WEBP_QUALITY | 覆盖EXR压缩类型,默认为3, 质量等级从1~100,越高越好,默认或者大于100,是无损压缩。 |
IMWRITE_PAM_TUPLETYPE Python: cv2.IMWRITE_PAM_TUPLETYPE | PAM图像,将TUPLETYPE 字段设置为格式定义的相应值 |
IMWRITE_TIFF_RESUNIT Python: cv2.IMWRITE_TIFF_RESUNIT | TIFF图像,设置特定值和DPI分辨率设置一样,参考libtiff。 |
IMWRITE_TIFF_XDPI Python: cv2.IMWRITE_TIFF_XDPI | TIFF图像,设置X方向的DPI |
IMWRITE_TIFF_YDPI Python: cv2.IMWRITE_TIFF_YDPI | TIFF图像,设置Y方向的DPI |
IMWRITE_TIFF_COMPRESSION Python: cv2.IMWRITE_TIFF_COMPRESSION | TIFF图像,用于指定图像的压缩模式,整型常量对应压缩模式(参考libtiff文档)。注意:参考libtiff问题的,深度为CV_32F,只有SGILOG模式可用,其他深度也可以设置此值,LZW为默认 |
IMWRITE_JPEG2000_COMPRESSION_X1000 Python: cv2.IMWRITE_JPEG2000_COMPRESSION_X1000 | JPEG2000,设置压缩比(已经乘了1000),值为0~1000,默认为1000 |
imshow
显示图像
如果在显示图像之前没有调用 namedWindow 则会根据图像大小创建图像窗口 (WINDOW_AUTOSIZE ),用户不能缩放窗口,窗口的尺寸已经固定了。
如果显示的图像大于屏幕的分辨率,可以在 imshow
之前调用 namedWindow("", WINDOW_NORMAL)
。
- 如果图像是无符号8位数据类型,直接显示。
- 如果图像是无符号16位数据类型,像素从[0,255*256] 映射到[0,255].
- 如果图像是32位或者64位浮点数据,像素值从[0,1] 映射到 [0, 255].
- 由于所需变换的模糊性,32位整数图像不再被处理。使用特定于图像上下文的自定义预处理将其转换为8位无符号矩阵。.
显示函数后面必须有 waitKey,可以在整个程序的任意位置,不一定非要在显示图像调用的函数内, 否则窗口会一闪而过。
接口
原型
void cv::imshow (const String & winname,InputArray mat)
cv2.imshow(winname, mat) -> None
参数
winname: 窗口名
mat: 需要显示的图像
显示标志 | 描述 |
---|---|
WINDOW_NORMAL Python: cv2.WINDOW_NORMAL | 用户可以任意的缩放窗口,没有限制 |
WINDOW_AUTOSIZE Python: cv2.WINDOW_AUTOSIZE | 用户不能缩放窗口,窗口尺寸收到显示图像的尺寸的约束 |
WINDOW_OPENGL Python: cv2.WINDOW_OPENGL | 窗口支持opengl |
WINDOW_FULLSCREEN Python: cv2.WINDOW_FULLSCREEN | 将窗口最大化 |
WINDOW_FREERATIO Python: cv2.WINDOW_FREERATIO | 可以任意尺寸,不受比例约束 |
WINDOW_KEEPRATIO Python: cv2.WINDOW_KEEPRATIO | 比例受图像比例约束 |
WINDOW_GUI_EXPANDED Python: cv2.WINDOW_GUI_EXPANDED | 状态栏和工具栏 |
WINDOW_GUI_NORMAL Python: cv2.WINDOW_GUI_NORMAL | 老方式 |
如果图像很大,一般选择 WINDOW_NORMAL
标志,可以自由缩放。
【参考】
- https://docs.opencv.org/4.5.5/db/deb/tutorial_display_image.html