Python数字图像处理:图像绘制与显示详解
本文详解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 | 黑-红-黄-白 |
| hsv | hsv颜色空间, 红-黄-绿-青-蓝-洋红-红 |
| 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数字图像处理绘制的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













