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

article/2025/10/6 13:41:17

文章目录

  • 目标
    • 代码
    • imread
      • 接口
        • 原型
        • 参数
      • 支持的格式
    • imwrite
      • 接口
        • 原型
        • 参数
    • imshow
      • 接口
        • 原型
        • 参数

目标

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

http://chatgpt.dhexx.cn/article/kH77CTZj.shtml

相关文章

44.Linux君正X1000-添加st7789v显示

由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD 它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型号和st7789v型号 思路: 1.uboot在显示LOG(初始化屏参数)之前,通过命令来读LCD型号,来检测LCD型…

HaaS100硬件规格

硬件配置 类别 参数 CPU 型号 HaaS 1000 架构 Cortex M33 主频 300MHz 片上Flash 16MB 内存 2.5MB SRAM 16MB PSRAM 硬件接口 类别 数量 性能指标 TF 卡槽 1个 最大支持 64GB RS485 1路 波特率支持1200bps ~ 115200bps RS232 1路 波特率最高支…

X1000对于CPU Core的参数解读(MIPS Cache)

各自摘抄整合&#xff0c;大多来自互联网&#xff0c;链接已全部放出来 1.MIPS-Based XBurst cores (up to 1.0GHz) 基于MIPS的XBurst核(最高可达1.0GHz) MIPS架构  XBurst是北京君正针对移动多媒体便携产品推出的一种创新的32位嵌入式CPU技术&#xff0c;它重新定义了32位嵌…

主控芯片成功案例:搭载北京君正X1000芯片,收款计算合二为一

具体硬件方面&#xff0c;商米码利奥Mini搭载了北京君正X1000芯片&#xff0c;该芯片具有性能强、功耗低的特点&#xff0c;主频可以达到1GHz &#xff0c;支持1秒极速启动&#xff0c;内置LPDDR&#xff08;X1000&#xff1a;32MB&#xff0c;X1000E&#xff1a;64MB&#xff…

【以太网硬件九】1000base-X是什么?

&#x1f449;个人主页&#xff1a; highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 说完千兆以太网电口&#xff0c;我们再来研究一下千兆光口的物理层规范。 千兆以太网…

比A100性能高4.5倍!英伟达H100横扫AI推理基准测试

视学算法报道 编辑&#xff1a;武穆 【导读】NVIDIA H100 Tensor Core GPU在MLPerf行业标准AI基准测试中首次亮相&#xff0c;创下了所有工作负载推理的世界纪录&#xff0c;提供的性能比上一代GPU高4.5 倍。 不久前&#xff0c;英伟达公布了旗下的芯片&#xff0c;在MLPerf行…

君正 X1000 音频驱动架构

X1000 音频驱动架构笔记 使用开发板X1000_HALLEY2_V2.0&#xff0c;源码为北京君正官方源码V7.0版本&#xff0c;与V6.0无太多差异 项目中遇到的问题 这是内核源码中设置所导致的&#xff0c;可能官方认为X1000这样设置会最好&#xff0c;可是我们需要小于30MS 的周期设置&…

华为metro1000描述,optix metro1000参数-华讯佳科技

OptiX Metro1000传输设备(简称Metro1000&#xff09;是华为技术有限公司研发的STM-1/STM-4/STM-16级别的盒式设备。华为Metro1000光端机主要应用于城域网、本地传输网接入层&#xff0c;具备结构简洁、集成度高等许多特点。 Metro1000光端机是华为技术有限公司开发的STM-1/STM-…

扔掉老破V100、A100,英伟达新一代计算卡H100来了

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

君正X1000开发板/方案开发介绍

君正X1000芯片开发板/方案开发&#xff0c;或者需要相关开发资料&#xff0c;如规格书&#xff0c;硬件设计&#xff0c;原理图等&#xff0c;可到一牛网论坛 X1000主要技术指标及特点 处理器 Ingenic X1000, 1.0GHz, 集成32Mbytes LPDDR 存储 16MBytes&#xff0c;4线SPI …

君正X1000平台内核SPI接口使用

一. 平台环境 开发板 X1000_HALLEY2_BASEBOARD_V4.1源码版本 ingenic-linux-kernel3.10.14-x1000-v8.2-20181116 二. 源码编译&#xff1a; 参照《v1000_v8.2版本编译_20181116》&#xff0c;可整体进行编译&#xff08;即同时编译生成x.bin,kernel镜像文件&#xff0c;文件…

算法工程师的职业发展前景思考和总结

本篇文章结合职友集数据对数据工程师【dba】通过个人理解和对职业行情现状进行个人主观总结。 声明&#xff1a;仅供参考&#xff0c;不是绝对&#xff0c;因人而异。 日期&#xff1a;2022年6月1日 作者&#xff1a;任聪聪 了解什么是算法工程师 首先算法工程师就是&#xff…

Python实现xls、xlsx文件内容替换的自定义函数

本篇文章主要讲解通过python批量替换xls、xlsx文件中的字符串的函数代码实例教程 日期:2023年5月9日 作者:任聪聪 版本:python3.9 前提准备 安装:xlrd,xlwt,openpyxl pip install 包名引入: import xlrd,xlwt,openpyxl实际效果: 可批量替换xls、xlsx两种文件类型,效…

Python实现doc、docx批量文本内容替换的代码实例

本篇文章主要讲解通过python及三方库实现doc、docx的批量文本内容替换的方法教程 日期:2023年5月10日 作者:任聪聪 python3.9版本 前提准备 安装: docx、win32 pip install 包名引入: import win32com.client as win32 import docx实际效果 可以修改doc、docx中包含图片…

程序员该怎么创业才比较靠谱?

本篇文章&#xff1a;主要讲解粉丝后台提问&#xff0c;创业相关问题。 作者&#xff1a;任聪聪 日期&#xff1a;2021年10月19日 宇宙的尽头绝对不是打工&#xff0c;打工是不可能的&#xff0c;程序员打一生的工时赚不到做企业能赚到的钱的。如果你月薪15k&#xff0c;到手11…

thinkphp5 线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法汇总

本篇文章主要讲解:thinkphp5 项目线上部署后view-source:可以看到源码,但是http显示空白页面的原因及解决方法教程 作者:任聪聪 日期:2023年4月17日 thinkphp版本5.1 现象说明: 线下测试环境,显示可以看到界面 部署到线上配置完毕后发现页面空白 在php中写入echo 1232…

AI数据标注工程师这个职业怎么样?

本篇文章主要讲解ai数据标注工程师这个职业的具体情况和相关的职业前景 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 数据是ai的灵魂&#xff0c;自然界中相对应的数据都活多少存在不准确、杂乱、无效等属性&#xff0c;需要人为进行收集、整理、分类和处理。其中ai…

js利用正则提取文本中所有符合的自定义文本内容方法教程

本篇文章主要讲解&#xff0c;使用js提取文本中所有出现的特定字符&#xff0c;保存在数组中并返回的实现方法。 日期&#xff1a;2022年12月9日 作者&#xff1a;任聪聪 一、使用的场景说明 一个超长文本中出现了n个固定规则的字符&#xff0c;但是需要将其进行提取并存在数组…

如何主动增加自己的开源项目star数的方法汇总

本篇文章主要讲解&#xff0c;通过自媒体、短视频、网络平台等渠道形式增加自己的开源项目的曝光度以增加star数的方法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月20日 开源项目的star数在某些找工作的情况下是有一定的加分的&#xff0c;故此价值是一定的。但是自己…