Python数字图像处理:图像绘制与显示详解

七月
七月
发布时间:2026-10-15 | 5人浏览过
原创

本文详解Python中数字图像的绘制与显示方法。重点讲解matplotlib.pyplot模块的imshow、figure及subplot函数用法,包括窗口创建、子图划分、颜色图谱设置及布局调整。同时介绍skimage.viewer模块基于Qt的图像显示方式,提供完整代码示例与参数说明。

正文

此前我们已涉及图像绘制操作,例如:

io.imshow(img)

该代码行的核心机制是调用matplotlib包进行图像渲染,执行完毕后返回一个matplotlib类型的数据对象。因此,代码也可表述为:

import matplotlib.pyplot as plt
plt.imshow(img)

imshow()函数的标准格式如下:

matplotlib.pyplot.imshow(X, cmap=None)

X参数代表待绘制的图像数据或数组。

cmap参数用于指定颜色图谱(colormap),默认情况下以RGB(A)颜色空间进行绘制。

其他可选的颜色图谱列表如下:

颜色图谱描述
autumn红-橙-黄
bone黑-白,x线
cool青-洋红
copper黑-铜
flag红-白-蓝-黑
gray黑-白
hot黑-红-黄-白
hsvhsv颜色空间, 红-黄-绿-青-蓝-洋红-红
inferno黑-红-黄
jet蓝-青-黄-红
magma黑-红-白
pink黑-粉-白
plasma绿-红-黄
prism 红-黄-绿-蓝-紫-...-绿模式
spring洋红-黄
summer绿-黄
viridis蓝-绿-黄
winter蓝-绿

常用图谱包括gray和jet等,具体示例如下:

plt.imshow(image,plt.cm.gray)
plt.imshow(img,cmap=plt.cm.jet)

图片在窗口绘制完成后,会返回一个AxesImage对象。若需在窗口中展示该对象,可调用show()函数。但在ipython等交互式练习环境中,通常可省略show()函数,系统会自动显示图像。

from skimage import io,data
img=data.astronaut()
dst=io.imshow(img)
print(type(dst))
io.show()

显示结果如下:

可见返回类型标识为'matplotlib.image.AxesImage'。为简化代码,显示图片时更常见的写法是:

import matplotlib.pyplot as plt
from skimage import io,data
img=data.astronaut()
plt.imshow(img)
plt.show()

matplotlib是一个专业的绘图库,功能类似于MATLAB中的plot,支持创建多个figure窗口、设置窗口标题、隐藏坐标轴,甚至利用subplot在同一figure中展示多张图片。通常导入matplotlib库的方式为:

import matplotlib.pyplot as plt

这表明绘图操作实际依赖于matplotlib包的pyplot模块。

一、使用figure函数和subplot函数分别创建主窗口与子图

示例:分离并同时显示宇航员图片的三个通道

from skimage import data
import matplotlib.pyplot as plt
img=data.astronaut()
plt.figure(num='astronaut',figsize=(8,8))  #创建一个名为astronaut的窗口,并设置大小 
plt.subplot(2,2,1)     #将窗口分为两行两列四个子图,则可显示四幅图片
plt.title('origin image')   #第一幅图片标题
plt.imshow(img)      #绘制第一幅图片
plt.subplot(2,2,2)     #第二个子图
plt.title('R channel')   #第二幅图片标题
plt.imshow(img[:,:,0],plt.cm.gray)      #绘制第二幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸
plt.subplot(2,2,3)     #第三个子图
plt.title('G channel')   #第三幅图片标题
plt.imshow(img[:,:,1],plt.cm.gray)      #绘制第三幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸
plt.subplot(2,2,4)     #第四个子图
plt.title('B channel')   #第四幅图片标题
plt.imshow(img[:,:,2],plt.cm.gray)      #绘制第四幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸
plt.show()   #显示窗口

在图像绘制过程中,利用matplotlib.pyplot模块下的figure()函数来创建显示窗口,其格式为:

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)

所有参数均为可选,且具备默认值,因此调用时可不带任何参数。各参数含义如下:

num:可为整型或字符型。若为整型,表示窗口序号;若为字符型,表示窗口名称。若两个窗口序号或名称相同,后创建的窗口将覆盖前一个窗口。

figsize:设置窗口大小,格式为整数元组,例如figsize=(8, 8)。

dpi:整型数字,表示窗口的分辨率。

facecolor:设置窗口的背景颜色。

edgecolor:设置窗口的边框颜色。

figure()函数创建的窗口默认仅显示一幅图片。若要显示多幅图片,需将该窗口划分为若干子图,并在各子图中分别显示不同图片。可使用subplot()函数进行子图划分,格式为:

matplotlib.pyplot.subplot(nrows, ncols, plot_number)

nrows:子图的行数。

ncols:子图的列数。

plot_number:当前子图的编号。

例如:

plt.subplot(2,2,1)

表示将figure窗口划分为2行2列共4个子图,当前操作针对第1个子图。也可采用以下写法:

plt.subplot(221)

两种写法效果一致。每个子图的标题可通过title()函数设置,坐标轴的显示与否可通过axis()函数控制,例如:

plt.subplot(221)
plt.title("first subwindow")
plt.axis('off')

二、使用subplots来创建显示窗口与划分子图

除上述方法外,还有另一种创建显示窗口和划分子图的编写方式,示例如下:

import matplotlib.pyplot as plt
from skimage import data,color
img = data.immunohistochemistry()
hsv = color.rgb2hsv(img)
fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()
ax0.imshow(img)
ax0.set_title("Original image")
ax1.imshow(hsv[:, :, 0], cmap=plt.cm.gray)
ax1.set_title("H")
ax2.imshow(hsv[:, :, 1], cmap=plt.cm.gray)
ax2.set_title("S")
ax3.imshow(hsv[:, :, 2], cmap=plt.cm.gray)
ax3.set_title("V")
for ax in axes.ravel():
    ax.axis('off')
fig.tight_layout()  #自动调整subplot间的参数

直接使用subplots()函数来创建并划分窗口。注意,该函数名比前面的subplot()多了一个's',其格式为:

matplotlib.pyplot.subplots(nrows=1, ncols=1)

nrows:所有子图的行数,默认为1。

ncols:所有子图的列数,默认为1。

该函数返回一个窗口figure对象和一个包含所有子图的tuple型ax对象。可结合ravel()函数列出所有子图,例如:

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()

创建了2行2列共4个子图,分别命名为ax0、ax1、ax2和ax3。每个子图的标题通过set_title()函数设置,例如:

ax0.imshow(img)
ax0.set_title("Original image")

若存在多个子图,还可使用tight_layout()函数调整显示布局,其格式为:

matplotlib.pyplot.tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None)

所有参数均为可选,调用时可省略所有参数。

pad:主窗口边缘与子图边缘之间的间距,默认为1.08。

h_pad、w_pad:子图边缘之间的间距,默认为 pad_inches。

rect:一个矩形区域,若设置此值,则将所有子图调整至该矩形区域内。

一般调用方式为:

plt.tight_layout()  #自动调整subplot间的参数

三、其他方法绘图并显示

除使用matplotlib库绘制图片外,skimage还提供了一个子模块viewer,其中包含显示图像的函数。不同之处在于,它利用Qt工具创建一块画布,并在该画布上绘制图像。

示例:

from skimage import data
from skimage.viewer import ImageViewer
img = data.coins()
viewer = ImageViewer(img)
viewer.show()

最后总结绘制和显示图片时常用的函数如下:

函数名功能调用格式
figure创建一个显示窗口plt.figure(num=1,figsize=(8,8)
imshow绘制图片plt.imshow(image)
show显示窗口plt.show()
subplot划分子图plt.subplot(2,2,1)
title设置子图标题(与subplot结合使用)plt.title('origin image')
axis是否显示坐标尺plt.axis('off')
subplots创建带有多个子图的窗口fig,axes=plt.subplots(2,2,figsize=(8,8))
ravel为每个子图设置变量ax0,ax1,ax2,ax3=axes.ravel()
set_title设置子图标题(与axes结合使用)ax0.set_title('first window')
tight_layout自动调整子图显示布局plt.tight_layout()

以上就是Python数字图像处理中图像绘制详解的详细内容,更多关于Python数字图像处理绘制的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表