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