Python數(shù)字圖像處理(5):圖像的繪制

實(shí)際上前面我們就已經(jīng)用到了圖像的繪制,如:
io.imshow(image)
這一行代碼的實(shí)質(zhì)是利用matplotlib包對圖片進(jìn)行繪制,繪制成功后,返回一個matplotlib類型的數(shù)據(jù)。因此,我們也可以這樣寫:

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

io.imshow()函數(shù)的格式是:
matplotlib.pyplot.imshow(X, cmap=None)
X為要繪制的圖像;
cmap為顏色圖譜(colormap), 默認(rèn)繪制為RGB(A)顏色空間。
還有其他的可選顏色圖譜:

顏色圖譜 具體顏色描述
autumn 紅橙黃
cool 青-洋紅
copper 黑-銅
flag 紅-白-藍(lán)-黑
gray 黑-白
hot 黑-紅-黃-白
hsv hsv顏色空間, 紅-黃-綠-青-藍(lán)-洋紅-紅
inferno 黑-紅-黃
jet 藍(lán)-青-黃-紅
magma 黑-紅-白
pink 黑-粉-白
plasma 綠-紅-黃
prism 紅-黃-綠-藍(lán)-紫-...-綠模式
spring 洋紅-黃
summer 綠-黃
viridis 藍(lán)-綠-黃
winter 藍(lán)-綠

用的比較多的是jet、gray等,如下:
plt.imshow(image, plt.cm.gray) plt.imshow(image, cmap = plt.cm.jet)
在窗口上繪制完圖片后,返回一個AxesImage對象。要在窗口上顯示這個對象,我們可以調(diào)用show()函數(shù)來進(jìn)行顯示,但進(jìn)行練習(xí)的時候(ipython環(huán)境中),一般我們可以省略show()函數(shù),也能自動顯示出來。

    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是一個專業(yè)繪圖的庫,相當(dāng)于matlab的plot函數(shù),可以設(shè)置多個figure窗口、設(shè)置figure的標(biāo)題、隱藏坐標(biāo)尺,甚至可以使用subplot在一個figure中顯示多張圖片。
不管我們利用skimage.io.imshow()還是matplotlib.pyplot.imshow()繪制圖像,最終都是調(diào)用的matplotlib.pyplot模塊。

一、利用figure()和subplot()分別創(chuàng)建主窗口和子圖

例一:分開并同時顯示小貓的三個通道
    from skimage import data
    import matplotlib.pyplot as plt
    image = data.chelsea()

    plt.figure(num='cat', figsize=(8,8))  #創(chuàng)建一個名為cat的窗口,并設(shè)置大小 

    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()函數(shù)來創(chuàng)建顯示窗口,該函數(shù)的格式為:
matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)
所有參數(shù)都是可選的,都有默認(rèn)值,因此調(diào)用該函數(shù)時可以不帶任何參數(shù),其中:
num: 整型或字符型都可以。如果設(shè)置為整型,則該整型數(shù)字表示窗口的序號。如果設(shè)置為字符型,則該字符串表示窗口的名稱。用該參數(shù)來命名窗口,如果兩個窗口序號或名相同,則后一個窗口會覆蓋前一個窗口;
figsize: 設(shè)置窗口大小。是一個tuple型的整數(shù),如figsize=(8,8);
dpi: 整形數(shù)字,表示窗口的分辨率;
facecolor: 窗口的背景顏色;
edgecolor: 窗口的邊框顏色。
用figure()函數(shù)創(chuàng)建的窗口,只能顯示一幅圖片,如果想要顯示多幅圖片,則需要將這個窗口再劃分為幾個子圖,在每個子圖中顯示不同的圖片。我們可以使用subplot()函數(shù)來劃分子圖,函數(shù)格式為:
matplotlib.pyplot.subplot(nrows, ncols, plot_number)
nrows: 子圖的行數(shù);
ncols: 子圖的列數(shù);
plot_number: 當(dāng)前子圖的編號。
如下:
plt.subplot(2, 2, 1)
或者
plt.subplot(221)
兩種寫法效果是一樣的。每個子圖的標(biāo)題可用title()函數(shù)來設(shè)置,是否使用坐標(biāo)尺可用axis()函數(shù)來設(shè)置,如:

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

二、用subplots來創(chuàng)建顯示窗口與劃分子圖

除了上面那種方法創(chuàng)建顯示窗口和劃分子圖,還有另外一種編寫方法也可以,如下例:

    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()函數(shù)來創(chuàng)建并劃分窗口。注意,比前面的subplot()函數(shù)多了一個s,該函數(shù)格式為:
matplotlib.pyplot.subplots(nrows=1, ncols=1)
nrows: 所有子圖行數(shù),默認(rèn)為1。
ncols: 所有子圖列數(shù),默認(rèn)為1。
返回一個窗口figure, 和一個tuple型的ax對象,該對象包含所有的子圖,可結(jié)合ravel()函數(shù)列出所有子圖,如:

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

創(chuàng)建了2行2列4個子圖,分別取名為ax0,ax1,ax2和ax3, 每個子圖的標(biāo)題用set_title()函數(shù)來設(shè)置,如:

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

如果有多個子圖,我們還可以使用tight_layout()函數(shù)來調(diào)整顯示的布局,該函數(shù)格式為:
matplotlib.pyplot.tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None)
所有的參數(shù)都是可選的,調(diào)用該函數(shù)時可省略所有的參數(shù)。
pad: 主窗口邊緣和子圖邊緣間的間距,默認(rèn)為1.08
h_pad, w_pad: 子圖邊緣之間的間距,默認(rèn)為 pad_inches
rect: 一個矩形區(qū)域,如果設(shè)置這個值,則將所有的子圖調(diào)整到這個矩形區(qū)域內(nèi)。
一般調(diào)用方法是:
plt.tight_layout() #自動調(diào)整subplot間的參數(shù)

三、其它方法繪圖并顯示

除了使用matplotlib庫來繪制圖片,skimage還有另一個子模塊viewer,也提供一個函數(shù)來顯示圖片。不同的是,它利用Qt工具來創(chuàng)建一塊畫布,從而在畫布上繪制圖像。

    from skimage import data
    from skimage.viewer import ImageViewer

    img = data.coins()
    viewer = ImageViewer(img)
    viewer.show()

最后總結(jié)一下,繪制和顯示圖片常用到的函數(shù)有:

函數(shù)名 功能 調(diào)用格式
figure 創(chuàng)建一個顯示窗口 plt.figure(um=1, figsize=(8, 8))
imshow 繪制圖片 plt.imshow(image)
show 顯示圖片 plt.show()
subplot 劃分子圖 plt.subplot(2,2,1)
title 設(shè)置子圖標(biāo)題(與subplot結(jié)合使用) plt.title('origin image')
axis 是否顯示坐標(biāo)尺 plt.axis('off')
subplots 創(chuàng)建帶有多個子圖的窗口 fig,axes=plt.subplots(2,2,figsize=(8,8))
ravel 為每個子圖設(shè)置變量 ax0,ax1,ax2,ax3=axes.ravel()
set_title 設(shè)置子圖標(biāo)題(與axes結(jié)合使用) ax0.set_title('first window')
tight_layout 自動調(diào)整子圖顯示布局 plt.tight_layout()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容