实际上前面咱们就已经用到了图像的绘制,如:html
io.imshow(img) python
这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据。所以,咱们也能够这样写:spring
import matplotlib.pyplot as plt plt.imshow(img)
imshow()函数格式为:api
matplotlib.pyplot.
imshow
(X, cmap=None)数组
X: 要绘制的图像或数组。函数
cmap: 颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。工具
其它可选的颜色图谱以下列表:布局
用的比较多的有gray,jet等,如:spa
plt.imshow(image,plt.cm.gray)
plt.imshow(img,cmap=plt.cm.jet)
在窗口上绘制完图片后,返回一个AxesImage对象。要在窗口上显示这个对象,咱们能够调用show()函数来进行显示,但进行练习的时候(ipython环境中),通常咱们能够省略show()函数,也能自动显示出来。code
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窗口,设置figure的标题,隐藏坐标尺,甚至能够使用subplot在一个figure中显示多张图片。通常咱们能够这样导入matplotlib库:
import matplotlib.pyplot as plt
也就是说,咱们绘图实际上用的是matplotlib包的pyplot模块。
1、用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: 设置窗口大小。是一个tuple型的整数,如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')
2、用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间的参数
3、其它方法绘图并显示
除了使用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() |