《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

2023-09-02 11:01:46

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存


本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第1章 图像的基本操作

为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。


本章内容概要
◎ 图像、视频文件和多帧图像(动图)的读取与保存。
◎ 从网络地址读取图像和含中文路径图像的读取方法。
◎ 图像的显示方法,包括使用Matplotlib显示图像。
◎ 使用摄像头拍摄视频及图像的方法。


1.1 图像的读取与保存

1.1.1 图像的读取

函数cv.imread用于从指定文件加载图像并返回该图像的矩阵。

函数原型
cv.imread(filename[, flags=IMREAD_COLOR]) → retval

参数说明

  • filename:读取图像的文件路径和文件名,包括文件扩展名。
  • flags:读取方式的参数,可选项如下。
    • IMREAD_COLOR:始终将图像转换为三通道BGR格式的彩色图像,是默认方式。
    • IMREAD_GRAYSCALE:始终将图像转换为单通道灰度图像。
    • IMREAD_UNCHANGED:按原样返回加载的图像(使用Alpha通道)。
    • IMREAD_ANYDEPTH:输入具有相应深度时会返回16位或32位图像,否则会转换为8位图像。
    • IMREAD_ANYCOLOR:以任何可能的颜色格式读取图像。
  • retval:返回值,读取的OpenCV图像为多维Numpy数组。

注意问题
(1) 在OpenCV中,最常用的图像数据结构是C++语言定义的Mat类。在Python语言中,Mat类的对象创建和操作是通过Numpy数组实现的。OpenCV对图像的任何操作,本质上都是对 Numpy数组的运算。
(2) OpenCV读取图像文件,返回值是二维或三维Numpy数组。当读取灰度图像时,返回值是形为(h,w)的二维数组;当读取彩色图像时,返回值是形为(h,w,ch)的三维数组。
(3) 如果无法读取图像(如文件不存在、权限不正确、格式不被支持或无效),并不会有报错提示,而会返回一个空矩阵。
(4) 该函数不支持带有中文或空格的文件路径和文件名,但也不会出现报错提示。当必须使用中文路径或文件名时,可以使用函数cv.imdecode 处理,具体参见【例程0103】。
(5) 在OpenCV中,使用的彩色图像为BGR格式的图像,读取图像文件后,图像文件可按B/G/R的顺序存储为多维数组。PIL、PyQt、Matplotlib 等库使用的是RGB格式的图像,图像文件按R/G/B的顺序存储。
(6) 该函数默认忽略图像的透明通道(Alpha通道),通过设置参数flags=IMAGE_
UNCHANGED可以读取透明通道。
(7) 对于彩色图像文件,该函数默认按彩色图像格式读取,也可以通过设置flags=0读取为灰度图像格式。将彩色图像格式读取为灰度图像格式,本质上是读取的彩色图像,并将彩色图像转换为灰度图像。
(8) 目前支持的文件及扩展名如下。
◎ Windows 位图:.bmp、.dib。
◎ JPEG 文件:.jpeg、.jpg、.jpe。
◎ JPEG 2000文件:.jp2。
◎ 便携式网络图形:.png。
◎ WebP:.webp。
◎ 便携式图像:.pbm、.pgm、.ppm、.pxm、.pnm。
◎ TIFF 文件:.tiff、.tif。


1.1.2 图像的保存

函数cv.imwrite可以基于扩展名的格式将图像保存到指定文件。
函数原型
cv.imwrite(filename, img[,params]) → retval

参数说明

  • filename:保存图像的文件路径和文件名,包括文件扩展名。
  • img:要保存的 OpenCV 图像,格式为多维Numpy数组。
  • params:编码格式参数,可选项如下。
    • IMWRITE_JPEG_QUALITY:设置JPEG/JPG格式图片的质量。数值越大,图片质量越高,取值范围为0~100,默认值为95。
    • IMWRITE_PNG_COMPRESSION:设置PNG 格式图片的压缩比。数值越大,压缩比越大,取值范围为0~9,默认值为3。
    • IMWRITE_TIFF_RESUNIT:设置TIF 格式图片的分辨率。
    • IMWRITE_WEBP_QUALITY:设置WEBP 格式图片的质量。数值越大,图片质量越高,取值范围为1~100,默认值为100。
    • IMWRITE_JPEG2000_COMPRESSION_X1000:设置JPEG2000格式图片的质量,默认值为1000。
  • retval:返回值,是布尔值,保存成功标志。

    注意问题
    (1) 图像通常保存为8位单通道图像或BGR三通道彩色图像,而BGRA四通道图像可以使用Alpha通道保存为PNG图像,更多设置详见OpenCV说明文档(链接1-1)。
    (2) 函数cv.imwrite将OpenCV图像(多维Numpy数组)保存为图像文件,图像的保存格式由filename的扩展名决定,与读取图像文件时的图像格式无关。
    (3) 函数cv.imwrite不支持带有中文或空格的文件路径和文件名,但也不会有报错提示。需要使用中文路径或文件名时,可以使用函数cv.imdecode 处理,参见【例程0103】。

【例程0101】用OpenCV读取和保存图像文件

本例程用OpenCV读取和保存图像文件,注意读取图像文件时的参数设置。

# 【0101】用OpenCV 读取和保存图像文件
import cv2 as cv

if __name__ == '__main__':
    # 读取图像文件,支持 BMP、JPG、PNG、TIFF 等常用格式
    filepath = "../images/Lena.tif"  # 读取图像文件的路径
    img = cv.imread(filepath, flags=1)  # flags=1 读取彩色图像文件(BGR)
    gray = cv.imread(filepath, flags=0)  # flags=0 读取为灰度图像

    saveFile = "../images/imgSave1.png"  # 保存图像文件的路径
    cv.imwrite(saveFile, img, [int(cv.IMWRITE_PNG_COMPRESSION), 8])
    cv.imwrite("../images/imgSave2.png", gray)

程序说明
(1) 本例程读取的图像文件是彩色图像文件。读取为彩色图像时可以设置flags=1,也可以省略;读取为灰度图像时必须设置flags=0。
(2) 读取和保存图像文件可以使用相对路径或绝对路径。
(3) 读取文件时要注意检查指定路径的图像文件是否存在。


【例程0102】从网络地址读取图像文件

本例程使用函数cv.imdecode从指定的内存缓存中读取数据,并将数据转换为图像格式,用于从网络传输数据中恢复图像。

# 【0102】从网络地址读取图像文件
import cv2 as cv
import numpy as np

if __name__ == '__main__':
    import urllib.request as request
    response = request.urlopen\
        ("https://profile.csdnimg.cn/8/E/F/0_youcans")  # 指定的 url 地址
    imgUrl = cv.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1)

    cv.imshow("imgUrl", imgUrl)  # 在窗口显示图像
    key = cv.waitKey(5000)  # 5000 毫秒后自动关闭
    cv.destroyAllWindows()

程序说明
(1) 从网络地址读取图像文件不能使用函数cv.imread,而要使用函数cv.imdecode。
(2) 函数cv.imdecode能将图像编码为流数据,赋值到内存缓存中,以方便网络传输。


【例程0103】读取和保存文件路径中带有中文字符的图像

本例程用于读取/保存文件路径中带有中文字符的图像。

# 【0103】读取和保存文件路径中带有中文字符的图像
import cv2 as cv
import numpy as np

if __name__ == '__main__':
    filepath = "../images/测试图01.tif"  # 带有中文的文件路径和文件名
    # img1 = cv.imread(filepath, flags=1)  # 中文路径读取失败,但不会报错
    img2 = cv.imdecode(np.fromfile(filepath, dtype=np.uint8), flags=-1)

    saveFile = "../images/测试图02.tif"  # 带有中文的保存文件路径
    # cv.imwrite(saveFile, img2)  # 中文路径保存失败,但不会报错
    cv.imencode(".jpg", img2)[1].tofile(saveFile)

程序说明
如果读取/保存图像的路径和文件名中含有中文字符,则不能用函数cv.imread/cv.imwrite操作,可以使用函数cv.imdecode/cv.imencode处理。


本书京东优惠购书链接:https://item.jd.com/14098452.html


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/132635637)
Copyright 2023 youcans, XUPT
Crated:2023-09-01

欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html

更多推荐

MySQL的时间差函数、日期转换计算函数

MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date)时间差函数(TIMESTAMPDIFF、DATEDIFF)需要用MySQL计算时间差,使用TIMESTAMPDIFF、DATEDIFF,记录一下实验结果--

举例说明用 easylanguage 语言,编写抄底公式

EasyLanguage语言在金融领域被广泛使用,尤其是用于编写交易策略和算法。以下是一个简单的抄底公式示例:swift复制//定义变量和参数DimStopLossPriceAsDoubleDimTakeProfitPriceAsDoubleDimInitialPositionAsDoubleDimSafetyZone

网络基础(一)

网络基础(一)在本篇文章中,我会详细介绍网络的一些基础知识,之后也会有持续的更新来帮助大家学习网络,希望大家可以通过博客学到更多的知识!了解网络去百度查询可以知道,网络是由若干节点和连接这些节点的链路构成的,表示诸多对象及其相互之间的联系。那么网络在我们生活中起到了举足轻重的作用,我们平时的一系列上网行为都离不开网络,

R语言CalibrationCurves包绘制带可信区间的校准曲线

校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距。一种是绘制连续的校准曲线。我们既往已经通过多篇文章介绍了校准曲线绘制,连续的和等分的都有介绍,今天咱们来介绍一下C

群体智能的实现与优化: 使用Metal技术在Swift中打造高效模型

1.群体智能简介群体智能是自然选择过程中形成的一种智能行为。你可以在鸟群飞翔、蚂蚁觅食、鱼群游动中看到这种行为。它们没有集中的控制中心,但却能通过局部互动实现整体的协同。这种行为为许多现代算法,如粒子群优化(PSO)和蚁群算法(ACO)提供了灵感。在这篇文章中,我们将探讨如何利用Apple的Metal技术,在Swift

【CSS3】CSS3 动画 ⑥ ( 动画属性示例 | 精灵图帧动画效果实现 )

文章目录一、需求说明二、代码分析1、动画属性2、布局分析3、动画实现三、完整代码示例一、需求说明给定一张精灵图,其中有多个动画帧对应的图片,下图的大小是1600x100像素,截图展示如下:实际图片:二、代码分析1、动画属性使用上图实现逐帧动画效果;实现逻辑是设置元素的animation-timing-function动

【CSS3】CSS3 3D 转换 ① ( CSS3 3D 转换简介 | 3D 物体与 2D 物体区别 | 3D 空间坐标系 | 常用的 3D 转换属性 | 3D 位移转换语法 | 代码示例 )

文章目录一、CSS33D转换简介1、3D物体与2D物体区别2、2D平面坐标系3、3D空间坐标系4、常用的3D转换属性二、3D位移转换1、3D位移转换语法2、代码示例分析三、代码示例1、代码示例-没有进行3D平移的参考示例代码示例执行结果2、代码示例-3D平移示例代码示例执行结果3、代码示例-3D平移简写形式示例代码示例

软件测试需求分析

1.1需求的重要性1.1.1软件缺陷的8020原则1)在软件测试过程中,从需求分析开始到集成测试阶段引入测试手段,能发现所有缺陷的80%;系统测试阶段引入测试手段,能发现剩余缺陷中80%的缺陷;在运行维护阶段经过长时间、大量运行软件后,能够发现最后剩余的20%的缺陷。1.2软件需求1.2.1软件需求的定义1)IEE软件

【错误记录】exe4j 打包程序无法设置 jar 包依赖的问题 ( 将源码 和 依赖库打包到同一个 jar 包中 )

文章目录一、问题描述二、解决方案一、问题描述在【错误记录】IntelliJIDEA导出可执行jar包执行报错(java.lang.ClassNotFoundException|打包时没有选择依赖库)博客中遇到java.lang.ClassNotFoundException:com.microsoft.sqlserver

【错误记录】Android Studio 中 Kotlin 版本报错 ( Module was compiled with an incompatible version of Kotlin. T )

文章目录一、报错信息二、问题分析三、解决方案1、低版本Gradle配置2、高版本Gradle配置一、报错信息在AndroidStudio中,编译应用,报如下错误:C:/Users/octop/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-s

设计模式Java实战

文章目录一、前置1.1目的1.2面向对象1.3接口和抽象类二、七大设计原则2.1单一职责2.2接口隔离原则2.3依赖倒转原则2.4里氏替换原则2.5开闭原则2.6不要重复原则2.7迪米特最少知道法则三、23种设计模式3.1创建型:创建对象3.1.1单例模式定义最佳实践场景线程级别的单例缺点3.1.2工厂模式(简单工厂)

热文推荐