實際上前面咱們就已經用到了圖像的繪製,如: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() |