【youcans 的图像处理学习课】2. 图像读取与显示

专栏地址:『youcans 的图像处理学习课』
文章目录:『youcans 的图像处理学习课 - 总目录』


【youcans 的图像处理学习课】2. 图像读取与显示

文章目录

  • 【youcans 的图像处理学习课】2. 图像读取与显示
    • 1. 图像的读取
    • 2. 图像的保存
    • 3. 图像的显示
    • 4. 通过 matplotlib 库显示图像


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@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/120995650)
Copyright 2022 youcans, XUPT

专栏地址:『youcans 的图像处理学习课』
文章目录:『youcans 的图像处理学习课 - 总目录』

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Css文本

Css文本 Css文本 Css文本属性可以定义文本外观。通过文本属性,你可以改变文本的颜色、字符间距、对齐文本,装饰文本,对文本进行缩进等等字符转换:text-transform 1.none2.uppercase3.lowercase 4.capitalize 默认值none对文本不做…

【youcans 的图像处理学习课】3. 图像的创建与修改

专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 【youcans 的图像处理学习课】3. 图像的创建与修改 文章目录【youcans 的图像处理学习课】3. 图像的创建与修改1. 图像基本知识1.1 图像颜色的分类1.2 数字图像的…

【OpenCV 例程300篇】01. 图像的读取(cv2.imread)

专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imsho…

【OpenCV 例程300篇】02. 图像的保存(cv2.imwrite)

专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imsho…

【OpenCV 例程300篇】03. 图像的显示(cv2.imshow)

专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imsho…

【OpenCV 例程300篇】04. 用 matplotlib 显示图像(plt.imshow)

专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imshow) 04. 用 matplotlib 显示图像(plt.imsho…

【OpenCV 例程300篇】05. 图像的属性(np.shape)

专栏地址:『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】05. 图像的属性(np.shape) OpenCV 中图像对象的数据结构是 ndarray 多维数组,因此 ndarray 数组的属性和操作方法也都适用于 OpenCV 的图像对象。 img.ndim&…

【OpenCV 例程300篇】06. 像素的编辑(img.itemset)

文章目录:『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】06. 像素的编辑(img.itemset) 像素是构成数字图像的基本单位,像素处理是图像处理的基本操作。 对像素的访问、修改,可以使用 Numpy 方法直接…

图片里的标志化的构造和执行

图片里的标志化的构造和执行 这是一篇解释在图片里面的进行标志化构造和执行的文章。你最好和这篇文章一起阅读 Symbolic API..标志构成 标志是我们想做的计算的描述。标志构造API生成计算图源来描述计算的需要。下面的图片显示了怎样我们组成标志来描述基本的计算。 mxnet.sy…

【OpenCV 例程300篇】07. 图像的创建(np.zeros)

专栏地址:『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】07. 图像的创建(np.zeros) OpenCV 中图像对象的数据结构是 ndarray 多维数组,因此可以用 Numpy 创建多维数组来生成图像。特别对于空白、黑色、白色、随机等特殊…

机器学习里面常用知识

每次手推公式就会遇见各种不会的,在网上搜了个总结的还不错的常用求导公式。。。继续更新中…… 一、基本线性代数 以下部分原文地址:http://blog.163.com/live_freely/blog/static/151142060201023154057339/ 在网上看到有人贴了如下求导公式&#xff1…

【OpenCV 例程300篇】09. 图像的裁剪(cv2.selectROI)

专栏地址:『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】09. 图像的裁剪(cv2.selectROI) 用 Numpy 的切片方法可以进行图像的裁剪,操作简单方便。 方法说明: retval img[y:yh, x:xw].copy() 对图像 img 裁…

【OpenCV 例程300篇】10. 图像的拼接(np.hstack)

3文章目录:『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】10. 图像的拼接(np.hstack) 用 Numpy 的数组堆叠方法可以进行图像的拼接,操作简单方便。 方法说明: retval numpy.hstack((img1, img2, ……

win下python和opencv安装

最简单粗暴的安装教程 1.先去下载3个文件pycharm(IDE),anaconda(集成库),opencv的whl文件 http://yun.baidu.com/share/link?shareid1022325066&uk1275716166 里面还有别的学习教程,包括opencv,numpy,matplotlib等。 2.把pycharm和an…

【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split)

文章目录:『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split) 函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。 函数说明: cv2.split(img[, mv]) -> retval …

机器学习矩阵求导

矩阵求导好像读书的时候都没学过,因为讲矩阵的课程上不讲求导,讲求导的课又不提矩阵。如果从事机器学习方面的工作,那就一定会遇到矩阵求导的东西。维基百科上:http://en.wikipedia.org/wiki/Matrix_calculus , 根据Y与…

【OpenCV 例程300篇】12. 图像通道的合并(cv2.merge)

文章目录:『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程300篇】12. 图像通道的合并(cv2.merge) 函数 cv2.merge() 将 B、G、R 单通道合并为 3 通道 BGR 彩色图像。 函数说明: cv2.merge(mv[, dst]) -> retval # BG…

机器学习向量化练习

机器学习向量化练习 在先前的练习里面,我们已经通过对自然图像完成了一个稀疏自编码的练习。在这次我们将通过向量化来使我们运行速度更快,并且我们将把它应用到手写数字里面。 数据下载 MNIST Dataset (Training Images)MNIST Dataset (Training Labe…

【OpenCV 例程200篇】13. 图像的加法运算(cv2.add)

专栏地址:『youcans 的 OpenCV 例程 200 篇』 文章目录:『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程 200 篇】13. 图像的加法运算(cv2.add) 函数 cv2.add() 用于图像的加法运算。 函数说明: …

【OpenCV 例程200篇】14. 图像与标量相加(cv2.add)

专栏地址:『youcans 的 OpenCV 例程 200 篇』 文章目录:『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程 200 篇】14. 图像与标量相加(cv2.add) 函数 cv2.add() 用于图像的加法运算。 函数说明: …