youcans 的 OpenCV 学习课—2.图像读取与显示

本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战。

本节介绍图像的读取、保存和显示。除基本方法和例程外,还给出了从网络读取图像、读取/保存中文路径图像、按指定大小显示图像、组合显示多个图像、通过 matplotlib 显示彩色和灰度图像的例程。

欢迎关注 『youcans 的 OpenCV 学习课 系列,持续更新
youcans 的 OpenCV 学习课—1.安装与环境配置
youcans 的 OpenCV 学习课—2.图像读取与显示
youcans 的 OpenCV 学习课—3.图像的创建与修改
youcans 的 OpenCV 学习课—4.图像的叠加与混合
youcans 的 OpenCV 学习课—5.图像的几何变换
youcans 的 OpenCV 学习课—6.灰度变换与直方图处理
youcans 的 OpenCV 学习课—7.空间域图像滤波
youcans 的 OpenCV 学习课—8.频率域图像滤波(上)
youcans 的 OpenCV 学习课—9.频率域图像滤波(下)

1. 图像的读取

函数 cv2.imread() 用于从指定的文件读取图像。

函数说明:

cv.imread(filename[, flags]) -> retval

  • 函数 cv2.imread() 从指定文件加载图像并返回该图像的矩阵。
  • 如果无法读取图像(文件丢失,权限不正确,格式不支持或无效),该函数返回一个空矩阵。
  • 目前支持的文件格式:
    • Windows 位图 - * .bmp,* .dib
    • JPEG 文件 - * .jpeg,* .jpg,*.jpe
    • JPEG 2000文件 - * .jp2
    • 便携式网络图形 - * .png
    • WebP - * .webp
    • 便携式图像格式 - * .pbm,* .pgm,* .ppm * .pxm,* .pnm
    • TIFF 文件 - * .tiff,* .tif

参数说明:

  • filename:要加载的文件的路径和名称
  • flags:读取图片的方式,可选项
    • cv2.IMREAD_COLOR(1):始终将图像转换为 3 通道BGR彩色图像,默认方式
    • cv2.IMREAD_GRAYSCALE(0):始终将图像转换为单通道灰度图像
    • cv2.IMREAD_UNCHANGED(-1):按原样返回加载的图像(使用Alpha通道)
    • cv2.IMREAD_ANYDEPTH(2):在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位
    • cv2.IMREAD_ANYCOLOR(4):以任何可能的颜色格式读取图像
  • 返回值 retval:OpenCV 图像,nparray 多维数组

注意事项:

  1. OpenCV 读取图像文件,返回值是一个nparray 多维数组。OpenCV 对图像的任何操作,本质上就是对 Numpy 多维数组的运算。
  2. OpenCV 中彩色图像使用 BGR 格式,而 PIL、PyQt、matplotlib 等库使用的是 RGB 格式。
  3. cv2.imread() 如果无法从指定文件读取图像,并不会报错,而是数返回一个空矩阵。
  4. cv2.imread() 指定图片的存储路径和文件名,在 python3 中不支持中文和空格(但并不会报错)。必须使用中文时,可以使用 cv2.imdecode() 处理,参见扩展例程。
  5. cv2.imread() 读取图像时默认忽略透明通道,但可以使用 CV_LOAD_IMAGE_UNCHANGED 参数读取透明通道。
  6. 对于彩色图像,可以使用 flags=0 按照读取为灰度图像。

基本例程:

    # 1.1 图像的读取imgFile = "../images/imgLena.tif"  # 读取文件的路径img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)img2 = cv2.imread(imgFile, flags=0)  # flags=0 读取为灰度图像

扩展例程:

    # 1.2 从网络读取图像import urllib.request as requestresponse = request.urlopen("https://profile.csdnimg.cn/8/E/F/0_youcans")imgUrl = cv2.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1)
    # 1.3 读取中文路径的图像imgFile = "../images/测试图01.png"  # 带有中文的文件路径和文件名# imread() 不支持中文路径和文件名,读取失败,但不会报错!# img = cv2.imread(imgFile, flags=1)# 使用 imdecode 可以读取带有中文的文件路径和文件名img = cv2.imdecode(np.fromfile(imgFile, dtype=np.uint8), -1)

2. 图像的保存

函数 cv2.imwrite() 用于将图像保存到指定的文件。

函数说明:

cv2.imwrite(filename, img [, flags])

  • cv2.imwrite() 将 OpenCV 图像保存到指定的文件。
  • cv2.imwrite() 基于保存文件的扩展名选择保存图像的格式。
  • cv2.imwrite() 只能保存 BGR 3通道图像,或 8 位单通道图像、或 PNG/JPEG/TIFF 16位无符号单通道图像。

参数说明:

  • filename:要保存的文件的路径和名称
  • img:要保存的 OpenCV 图像,nparray 多维数组
  • flags:不同编码格式的参数,可选项
    • cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
    • cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
    • cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。

注意事项:

  1. cv2.imwrite() 保存的是 OpenCV 图像(多维数组),不是 cv2.imread() 读取的图像文件,所保存的文件格式是由 filename 的扩展名决定的,与读取的图像文件的格式无关。
  2. 对 4 通道 BGRA 图像,可以使用 Alpha 通道保存为 PNG 图像。
  3. cv2.imwrite() 指定图片的存储路径和文件名,在 python3 中不支持中文和空格(但并不会报错)。必须使用中文时,可以使用 cv2.imencode() 处理,参见扩展例程。

基本例程:

    # 1.4 图像的保存imgFile = "../images/logoCV.png"  # 读取文件的路径img3 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)saveFile = "../images/imgSave.png"  # 保存文件的路径# cv2.imwrite(saveFile, img3, [int(cv2.IMWRITE_PNG_COMPRESSION), 8])  # 保存图像文件, 设置压缩比为 8cv2.imwrite(saveFile, img3)  # 保存图像文件

扩展例程:

    # 1.5 保存中文路径的图像imgFile = "../images/logoCV.png"  # 读取文件的路径img3 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)saveFile = "../images/测试图02.jpg"  # 带有中文的保存文件路径# cv2.imwrite(saveFile, img3)  # imwrite 不支持中文路径和文件名,读取失败,但不会报错!img_write = cv2.imencode(".jpg", img3)[1].tofile(saveFile)

3. 图像的显示

函数 cv2.imshow() 用于在窗口中显示图像。

函数说明:

imshow(winname, img) -> None

  • 函数 cv2.imshow() 在指定窗口中显示 OpenCV 图像,窗口自适应图像大小。
  • 显示图像的缩放取决于图像深度:
    • 对 8 位无符号图像,按原样显示;
    • 对 16 位无符号或 32 位整数图像,将像素值范围 [0,255 * 256] 映射到 [0,255] 显示;
    • 对 32 位浮点图像,将像素值范围 [0,1] 映射到 [0,255] 显示;
    • 如果指定窗口尚未创建,则创建一个自适应图像大小的窗口;
    • 如果要显示大于屏幕分辨率的图像,需要先调用 namedWindow("",WINDOW_NORMAL)。

参数说明:

  • winname:字符串,显示窗口的名称。
  • img:所显示的 OpenCV 图像,nparray 多维数组

注意事项:

  1. 函数 cv2.imshow() 之后要用 waitKey() 函数设定图像窗口的显示时长,否则不会显示图像窗口。
  2. 图像窗口将在 waitKey() 函数所设定的时长(毫秒)后自动关闭,waitKey(0) 表示窗口显示时长为无限。
  3. 可以创建多个不同的显示窗口,每个窗口必须命名不同的 filename。
  4. 可以用 destroyWindow() 函数关闭指定的显示窗口,也可以用 destroyAllWindows() 函数关闭所有的显示窗口。

基本例程:

    # 1.6 图像的显示(cv2.imshow)imgFile = "../images/imgLena.tif"  # 读取文件的路径img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)img2 = cv2.imread(imgFile, flags=0)  # flags=0 读取为灰度图像cv2.imshow("Demo1", img1)  # 在窗口 "Demo1" 显示图像 img1cv2.imshow("Demo2", img2)  # 在窗口 "Demo2" 显示图像 img2key = cv2.waitKey(1000)  # 等待按键命令, 1000ms 后自动关闭

扩展例程:

    # 1.7 图像显示(按指定大小的窗口显示图像)imgFile = "../images/imgLena.tif"  # 读取文件的路径img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)cv2.namedWindow("Demo3", cv2.WINDOW_NORMAL)cv2.resizeWindow("Demo3", 400, 300)cv2.imshow("Demo3", img1)  # 在窗口 "Demo3" 显示图像 img1key = cv2.waitKey(0)  # 等待按键命令
    # 1.8 图像显示(多个图像组合显示)imgFile1 = "../images/imgLena.tif"  # 读取文件的路径img1 = cv2.imread(imgFile1, flags=1)  # flags=1 读取彩色图像(BGR)imgFile2 = "../images/imgGaia.tif"  # 读取文件的路径img2 = cv2.imread(imgFile2, flags=1)  # # flags=1 读取彩色图像(BGR)imgStack = np.hstack((img1, img2))  # 相同大小图像水平拼接cv2.imshow("Demo4", imgStack)  # 在窗口 "Demo4" 显示图像 imgStackkey = cv2.waitKey(0)  # 等待按键命令


4. 通过 matplotlib 库显示图像

函数 plt.imshow() 用于通过 matplotlib 库显示图像。

函数说明:

matplotlib.pyplot.imshow(img[, cmap])

OpenCV 使用 BGR 格式,matplotlib/PyQt 使用 RGB 格式。使用 matplotlib/PyQt 显示 openCV 图像,要将 BGR 格式转换为 RGB 格式:

# 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)

参数说明:

  • img:图像数据,nparray 多维数组,对于 openCV(BGR)格式图像要先进行格式转换
  • cmap:颜色图谱(colormap),默认为 RGB(A) 颜色空间
    • gray:灰度显示
    • hsv:hsv 颜色空间

注意事项:

  1. OpenCV 和 matplotlib 中的彩色图像都是 Numpy 多维数组。但 OpenCV 使用 BGR 格式,颜色分量按照蓝/绿/红的次序排列,而 matplotlib 使用 RGB 格式,颜色分量按照红/绿/蓝的次序排序。因此用 plt.imshow() 显示 OpenCV 彩色图像时,先要进行颜色空间转换,将Numpy 多维数组按照红/绿/蓝的次序排序。
  2. plt.imshow() 可以直接显示 OpenCV 灰度图像,不需要格式转换,但需要使用 cmap=‘gray’ 进行参数设置。
  3. plt.imshow() 可以使用 matplotlib 库中的各种方法绘图,如标题、坐标轴、插值等,详见 matploblib Document。
  4. PyQt5 也使用 RGB 格式,因此在 PyQt5 中显示 OpenCV 彩色图像时,也要进行颜色空间转换。

基本例程:

    # 1.10 图像显示(plt.imshow)imgFile = "../images/imgLena.tif"  # 读取文件的路径img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)  # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)  # 图片格式转换:BGR(OpenCV) -> Grayplt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签plt.subplot(221), plt.title("1. RGB 格式(mpl)"), plt.axis('off')plt.imshow(imgRGB)  # matplotlib 显示彩色图像(RGB格式)plt.subplot(222), plt.title("2. BGR 格式(OpenCV)"), plt.axis('off')plt.imshow(img1)    # matplotlib 显示彩色图像(BGR格式)plt.subplot(223), plt.title("3. 设置 Gray 参数"), plt.axis('off')plt.imshow(img2, cmap='gray')  # matplotlib 显示灰度图像,设置 Gray 参数plt.subplot(224), plt.title("4. 未设置 Gray 参数"), plt.axis('off')plt.imshow(img2)  # matplotlib 显示灰度图像,未设置 Gray 参数plt.show()

程序说明:

图 1 中 OpenCV 的 BGR 彩色图像已转换为 RGB 格式,彩色图像的颜色显示正常;
图 2 中 OpenCV 的 BGR 彩色图像格式未做转换,彩色图像的颜色显示异常;
图 3 中 plt.imshow() 设置 cmap=‘gray’,灰度图像的颜色显示正常;
图 4 中 plt.imshow() 未设置 cmap=‘gray’,灰度图像的颜色显示异常。


【本节完】

版权声明:

『youcans 的 OpenCV 学习课』
原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/121068773
Copyright 2021 youcans, XUPT
Crated:2021-11-01

欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新
youcans 的 OpenCV 学习课—1.安装与环境配置
youcans 的 OpenCV 学习课—2.图像读取与显示
youcans 的 OpenCV 学习课—3.图像的创建与修改
youcans 的 OpenCV 学习课—4.图像的叠加与混合
youcans 的 OpenCV 学习课—5.图像的几何变换
youcans 的 OpenCV 学习课—6.灰度变换与直方图处理
youcans 的 OpenCV 学习课—7.空间域图像滤波
youcans 的 OpenCV 学习课—8.频率域图像滤波(上)
youcans 的 OpenCV 学习课—9.频率域图像滤波(下)

youcans 的 OpenCV 学习课—2.图像读取与显示相关推荐

  1. youcans 的 OpenCV 学习课—5.图像的几何变换

    youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...

  2. youcans 的 OpenCV 学习课—4.图像的叠加与混合

    youcans 的 OpenCV 学习课-4.图像的叠加与混合 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的加法.叠加与混合,提供完整例程和运行结果:加法 ...

  3. youcans 的 OpenCV 学习课—3.图像的创建与修改

    youcans 的 OpenCV 学习课-3.图像的创建与修改 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. OpenCV 中图像的数据结构是 ndarray 多维数组, ...

  4. youcans 的 OpenCV 学习课—8.频率域图像滤波(上)

    欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新中 youcans 的 OpenCV 学习课-1.安装与环境配置 yo ...

  5. youcans 的 OpenCV 学习课—10. 图像复原与重建

    youcans 的 OpenCV 学习课-10. 图像复原与重建 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 图像复原是对图像退化过程建模,并以图像退化的先验知识来恢复 ...

  6. youcans 的 OpenCV 学习课—6.灰度变换与直方图处理

    youcans 的 OpenCV 学习课-6.灰度变换与直方图处理 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 空间域的图像处理方法直接对图像的像素点进行处理,空间域图 ...

  7. youcans 的 OpenCV 学习课—1.安装与环境配置

    youcans 的 OpenCV 学习课-1.安装与环境配置 作者: youcans@xupt 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 什么叫从零开始?从软件安装. ...

  8. 【youcans 的 OpenCV 学习课】7. 空间域图像滤波

    专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 [youcans 的 OpenCV 学习课]7. 空间域图像滤波 图像滤波是在尽可能保留图像 ...

  9. 【youcans 的图像处理学习课】22. Haar 级联分类器

    专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 [youcans 的图像处理学习课]22. Haar 级联分类器 3. Haar 特征及其加 ...

最新文章

  1. scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...
  2. 剑指offer23:从上到下打印二叉树
  3. XenDesktop中无法删除虚拟机
  4. C# WebBrowser document.execCommand()解析
  5. 网易云信携手“瑶台”,打造元宇宙商业化实践标杆案例
  6. Java共现矩阵的构建(用于社交网络结构分析)
  7. Python递归函数的正确理解与使用
  8. mysql增删改查_MySQL的基本使用——简单的增删改查
  9. 商品翻牌效果(纯css)
  10. Python 数据结构与算法——图(Graph)
  11. c语言 屏幕刷新,屏幕刷新率
  12. 做网站用企业网站模板好不好
  13. GIS空间分析(一)——空间分析与GIS
  14. 数据结构习题——第一章 绪论
  15. C#绘制中国象棋棋盘
  16. 【图像超分辨率重建】——HAN论文精读笔记
  17. 关于印发《建造师执业资格制度暂行规定》的通知
  18. STM32实现自定义HID复合设备
  19. 收集-网站后台优秀文章
  20. Android适合手机开发的又一力证——安卓街机

热门文章

  1. Python数据结构与算法(六)--栈和队列
  2. 自定义按键_王者荣耀:自定义按键让你的百里守约百发百中
  3. Idea怎么实现画类图
  4. CGLib动态代理原理
  5. Redis学习笔记——SpringDataRedis的使用
  6. JDBC中使用preparedStatement防止SQL注入
  7. c# 计算机ip,C# 获取电脑的IP,网关,MAC,计算机名。。
  8. 计算机考试中英文打字题,五笔及中英文打字试题(2套)含答案.docx
  9. C语言中输入123求位权,数反转 - it610.com
  10. 计算机桌面壁纸怎样拉伸,win10桌面壁纸怎么拉伸?手把手教你拉伸win10桌面壁纸的方法...