『OpenCV-Python』配合 Matplotlib 显示图像

点赞 + 关注 + 收藏 = 学会了

对于刚接触 opencv 的工友来说,能快速看到图像处理的效果是很重要的。OpenCV 内置了图像预览方法,我在之前的文章里已经介绍过。

而在 Python 生态里,有一个更厉害的图像显示工具 —— Matplotlib

  • OpenCV:这是一个专门用于图像处理和计算机视觉的开源库,它能方便地读取、处理各种图像。

  • Matplotlib:这是 Python 的一个绘图库,其中的 pyplot 模块可以像 MATLAB 一样创建各种类型的图表,包括显示图像,而且显示效果直观,还能在图像上做一些简单标注等。

用 OpenCV 读取图像后,再用 Matplotlib 显示,既能利用 OpenCV 的读取优势,又能借助 Matplotlib 的显示优势。

上手操作

安装相关库

如果还没有安装这两个库,需要先进行安装。打开命令提示符(Windows)或终端(Mac/Linux),输入以下命令:

pip install opencv-python
pip install matplotlib

导入库

在 Python 代码中,首先要导入需要用到的库:

import cv2  # 导入OpenCV库,通常简写为cv2
import matplotlib.pyplot as plt  # 导入Matplotlib的pyplot模块,通常简写为plt

读取图像

用 OpenCV 的imread函数读取图像。需要注意的是,要正确填写图像的路径,如果图像和代码文件在同一个文件夹里,直接写图像文件名即可;如果不在,要写完整的路径。

# 读取图像,参数为图像路径
img = cv2.imread('图片路径')

要是读取失败,可能是路径写错了,或者图像文件损坏了,可以检查一下这两个方面。

图像颜色通道转换

OpenCV 读取图像时,默认的颜色通道是 BGR(蓝、绿、红),而 Matplotlib 显示图像时默认的是 RGB(红、绿、蓝)。如果不进行转换,显示的图像颜色会不正常(比如红色和蓝色会颠倒)。所以需要进行通道转换,用 OpenCV 的cvtColor函数:

# 将BGR格式转换为RGB格式
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

用 Matplotlib 显示图像

做好前面的准备后,就可以用 Matplotlib 显示图像了:

# 创建一个图像窗口
plt.figure()

# 显示图像,参数为要显示的图像
plt.imshow(img_rgb)

# 隐藏坐标轴,让图像显示更整洁
plt.axis('off')

# 显示图像
plt.show() 

完整的代码及展示效果

我在项目里创建了一个 images 目录,把 雷猴.jpeg 图片放在里面。

import cv2  # 导入OpenCV库,通常简写为cv2
import matplotlib.pyplot as plt  # 导入Matplotlib的pyplot模块,通常简写为plt

# 读取图像,参数为图像路径
img = cv2.imread('./images/雷猴.jpeg')

# 将BGR格式转换为RGB格式
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 创建一个图像窗口
plt.figure()

# 显示图像,参数为要显示的图像
plt.imshow(img_rgb)

# 隐藏坐标轴,让图像显示更整洁
plt.axis('off')

# 显示图像
plt.show() 

关键方法讲解

plt.figure

使用 plt.figure() 创建了一个图像窗口。

plt.figure 的语法:

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
  • num:图像窗口的标识,可以是整数或字符串。如果未指定,会自动递增生成;若指定相同的值,会复用已有的窗口。

  • figsize:以元组形式指定窗口的大小,格式为(宽, 高),单位是英寸。例如figsize=(8, 6)表示窗口宽 8 英寸,高 6 英寸。

  • dpi:指定图像的分辨率,即每英寸的像素数,数值越大图像越清晰。

  • facecolor:窗口的背景颜色,默认是白色。

  • edgecolor:窗口边缘的颜色。

  • frameon:布尔值,是否显示窗口的边框,默认为True(显示)。

plt.imshow

plt.imshow() 的作用是将图像数据加载到创建的图像窗口中,是显示图像的核心步骤。

plt.imshow(X, cmap=None, aspect=None, interpolation=None)
  • X:要显示的图像数据,可以是数组形式。对于彩色图像,通常是三维数组(高度, 宽度, 通道数);对于灰度图像,是二维数组(高度, 宽度)。

  • cmap:指定颜色映射表,用于灰度图像或单通道图像的颜色显示。默认是viridis,显示彩色时一般不用设置,显示灰度图时需设置为’gray’。

  • aspect:控制图像的宽高比,’auto’表示自动调整以适应窗口,’equal’表示保持图像原始的宽高比。

  • interpolation:指定图像缩放时的插值方法,如’nearest’(最近邻插值)、’bilinear’(双线性插值)等,影响图像缩放后的平滑程度。

plt.axis

plt.axis() 可以控制坐标轴的显示状态或范围,在显示图像时设置为’off’可以让图像显示更简洁。

如果上面代码把 plt.axis('off') 这句注销掉的话,展示的图像左侧及下方都会显示坐标轴。

plt.axis 的语法如下:

plt.axis(arg)
  • arg可以是’on’(显示坐标轴)、’off’(隐藏坐标轴),也可以是一个列表[xmin, xmax, ymin, ymax],用于指定坐标轴的范围。
plt.show

plt.show() 显示所有创建的图像窗口,将之前通过plt.imshow等方法加载的图像内容呈现出来。在脚本中,必须调用该方法才能看到图像;在交互式环境(如 Jupyter Notebook)中,有时会自动显示,但显式调用更稳妥。

进阶玩法

显示灰度图像

如果想显示灰度图像,步骤略有不同。OpenCV 读取灰度图像时,可以在imread函数中添加参数cv2.IMREAD_GRAYSCALE,此时读取的图像是单通道的,不需要进行颜色通道转换。

只需在上一个例子里该一句代码

# 读取图像,参数为图像路径
img = cv2.imread('./images/雷猴.jpeg', cv2.IMREAD_GRAYSCALE)

多图对比显示

在处理图像时,经常需要对比原图和处理后的图像,Matplotlib 的subplot函数可以实现多图在同一窗口显示。

import cv2  # 导入OpenCV库,通常简写为cv2
import matplotlib.pyplot as plt  # 导入Matplotlib的pyplot模块,通常简写为plt

# 读取图像,参数为图像路径
img = cv2.imread('./images/雷猴.jpeg')

# 将BGR格式转换为RGB格式
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 将原图转为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建一个2行1列的子图布局

plt.subplot(2, 1, 1)  # 第1行第1列的子图
plt.imshow(img_rgb)
plt.title('origin')  # 给子图添加标题
plt.axis('off')

plt.subplot(2, 1, 2)  # 第2行第1列的子图
plt.imshow(gray_img, cmap='gray')
plt.title('gray')
plt.axis('off')

# 调整子图之间的间距
plt.show()

关键方法讲解

plt.subplot

plt.subplot() 的作用是在一个图像窗口中创建多个子图,实现多幅图像的对比显示。例如plt.subplot(2, 1, 1)表示创建一个 2 行 1 列的子图布局,当前操作第 1 个子图。

语法:

plt.subplot(nrows, ncols, index)
  • nrows:子图的行数。

  • ncols:子图的列数。

  • index:当前子图的索引,从 1 开始,按行优先顺序排列。


以上就是本文的全部内容啦,想了解更多 OpenCV 的玩法,欢迎关注 《OpenCV-Python 中文教程》

也可以➕我 green bubble 吹吹水咯

点赞 + 关注 + 收藏 = 学会了

本作品采用《CC 协议》,转载必须注明作者和本文链接
公众号:德育处主任
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!