【OpenCV-Python】教程:1-1 图像读取显示保存

目标

lena.jpg

  1. 读图片
  2. 显示图片
  3. 保存图片

代码

## 导入库
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: 读取模式

支持的格式

支持的格式如下

  1. *.bmp, *.dib - Windows bitmaps (总是支持)
  2. *jpeg, *.jpg, *.jpe - JPEG files (看备注)
  3. *.jp2 - JPEG 2000 files (看备注)
  4. *.png - Portable Network Graphics ( 看备注)
  5. *.webp - WebP ( 看备注)
  6. *.pbm, *.pgm, *.ppm *.pxm, *.pnm - Portable image format (总是支持)
  7. *.pfm - PFM files ( 看备注)
  8. *.sr, *.ras - Sun rasters (总是支持)
  9. *.tiff, *.tif - TIFF files ( 看备注)
  10. *.exr - OpenEXR Image files ( 看备注)
  11. *.hdr, *.pic - Radiance HDR (总是支持)
  12. Raster and Vector geospatial data supported by GDAL ( 看备注)

备注

  • 不是根据文件后缀确定的,而是根据文件内容确定的。
  • 彩色图像,解码后以 B-G-R通道顺序存放数据。
  • 当用 IMREAD_GRAYSCALE格式读取时,会用到内部的灰度解码,结果可能与 cvtColor()有些不同。
  • WindowsMacOSX上,默认使用 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 驱动就可以使用从而可以解码图像,支持 RasterVector
  • 如果 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_GDALGADL驱动加载图像
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_QUALITYJPEG,压缩质量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_INTERVALJPEG重启间隔,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_COMPRESSIONPNG图像,压缩等级0~9,值越高,压缩越厉害,图像尺寸越小,压缩时间越长,默认为1,最佳速度设置
IMWRITE_PNG_STRATEGY Python: cv2.IMWRITE_PNG_STRATEGYOne ofcv::ImwritePNGFlags, 默认为IMWRITE_PNG_STRATEGY_RLE.
IMWRITE_PNG_BILEVEL Python: cv2.IMWRITE_PNG_BILEVEL二值等级,0或1,默认为0
IMWRITE_PXM_BINARY Python: cv2.IMWRITE_PXM_BINARYPPM,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_TUPLETYPEPAM图像,将TUPLETYPE 字段设置为格式定义的相应值
IMWRITE_TIFF_RESUNIT Python: cv2.IMWRITE_TIFF_RESUNITTIFF图像,设置特定值和DPI分辨率设置一样,参考libtiff。
IMWRITE_TIFF_XDPI Python: cv2.IMWRITE_TIFF_XDPITIFF图像,设置X方向的DPI
IMWRITE_TIFF_YDPI Python: cv2.IMWRITE_TIFF_YDPITIFF图像,设置Y方向的DPI
IMWRITE_TIFF_COMPRESSION Python: cv2.IMWRITE_TIFF_COMPRESSIONTIFF图像,用于指定图像的压缩模式,整型常量对应压缩模式(参考libtiff文档)。注意:参考libtiff问题的,深度为CV_32F,只有SGILOG模式可用,其他深度也可以设置此值,LZW为默认
IMWRITE_JPEG2000_COMPRESSION_X1000 Python: cv2.IMWRITE_JPEG2000_COMPRESSION_X1000JPEG2000,设置压缩比(已经乘了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 标志,可以自由缩放。

【参考】

  1. https://docs.opencv.org/4.5.5/db/deb/tutorial_display_image.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老周有AI~算法定制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值