Python数字图像处理Opencv-Python

Python数字图像处理(5):图像的绘制

2017-02-26  本文已影响497人  自律小生

实际上前面我们就已经用到了图像的绘制,如:
io.imshow(image)
这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据。因此,我们也可以这样写:

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

io.imshow()函数的格式是:
matplotlib.pyplot.imshow(X, cmap=None)
X为要绘制的图像;
cmap为颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。
还有其他的可选颜色图谱:

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

用的比较多的是jet、gray等,如下:
plt.imshow(image, plt.cm.gray) plt.imshow(image, cmap = plt.cm.jet)
在窗口上绘制完图片后,返回一个AxesImage对象。要在窗口上显示这个对象,我们可以调用show()函数来进行显示,但进行练习的时候(ipython环境中),一般我们可以省略show()函数,也能自动显示出来。

    from skimage import io, data
    image = data.chelsea()
    axe_image = io.imshow(image)
    print(type(axe_image))
    io.show()

输出为:
<class 'matplotlib.image.AxesImage'>

小猫
可以看到,类型是matplotlib.image.AxesImage。一般,我们更愿意利用如下的方式显示图片:
    from skimage import data
    import matplotlib.pyplot as plt
    image = data.chelsea()
    plt.imshow(image)
    plt.show()

matplotlib是一个专业绘图的库,相当于matlab的plot函数,可以设置多个figure窗口、设置figure的标题、隐藏坐标尺,甚至可以使用subplot在一个figure中显示多张图片。
不管我们利用skimage.io.imshow()还是matplotlib.pyplot.imshow()绘制图像,最终都是调用的matplotlib.pyplot模块。

一、利用figure()和subplot()分别创建主窗口和子图

例一:分开并同时显示小猫的三个通道
    from skimage import data
    import matplotlib.pyplot as plt
    image = data.chelsea()

    plt.figure(num='cat', figsize=(8,8))  #创建一个名为cat的窗口,并设置大小 

    plt.subplot(2, 2, 1)
    plt.title('Original Image')
    plt.imshow(image)

    plt.subplot(2, 2, 2)
    plt.title('R channel')
    plt.imshow(image[:, :, 0])

    plt.subplot(2, 2, 3)
    plt.title('G channel')
    plt.imshow(image[:, :, 1])
    
    plt.subplot(2, 2, 4)
    plt.title('B channel')
    plt.imshow(image[:, :, 2])

    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)
或者
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

    image = data.chelsea()
    image_hsv = color.rgb2hsv(image)

    fig, axes = plt.subplots(2, 2, figsize=(8, 8))
    axe0, axe1, axe2, axe3 = axes.ravel()

    axe0.imshow(image)
    axe0.set_title('Original Image')

    axe1.imshow(image_hsv[:, :, 0])
    axe1.set_title('H channel')

    axe2.imshow(image_hsv[:, :, 1])
    axe2.set_title('S channel')
    
    axe3.imshow(image_hsv[:, :, 2])
    axe3.set_title('V channel')
    
            for ax in axes.ravel():
        ax.axis('off')

    fig.tight_layout()

    plt.show()
HSV小猫

直接用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=(8, 8))
    axe0, axe1, axe2, axe3 = axes.ravel()

创建了2行2列4个子图,分别取名为ax0,ax1,ax2和ax3, 每个子图的标题用set_title()函数来设置,如:

    axe0.imshow(image)
    axe0.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(um=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()
上一篇下一篇

猜你喜欢

热点阅读