您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“怎么使用python進(jìn)行圖像繪制”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“怎么使用python進(jìn)行圖像繪制”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
實(shí)際上前面我們就已經(jīng)用到了圖像的繪制,如:
io.imshow(img)
這一行代碼的實(shí)質(zhì)是利用matplotlib包對(duì)圖片進(jìn)行繪制,繪制成功后,返回一個(gè)matplotlib類型的數(shù)據(jù)。因此,我們也可以這樣寫:
import matplotlib.pyplot as plt plt.imshow(img)
imshow()函數(shù)格式為:
matplotlib.pyplot.imshow(X, cmap=None)
X: 要繪制的圖像或數(shù)組。
cmap: 顏色圖譜(colormap), 默認(rèn)繪制為RGB(A)顏色空間。
其它可選的顏色圖譜如下列表:
顏色圖譜 | 描述 |
---|---|
autumn | 紅-橙-黃 |
bone | 黑-白,x線 |
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)-綠 |
用的比較多的有g(shù)ray,jet等,如:
plt.imshow(image,plt.cm.gray)
plt.imshow(img,cmap=plt.cm.jet)
在窗口上繪制完圖片后,返回一個(gè)AxesImage對(duì)象。要在窗口上顯示這個(gè)對(duì)象,我們可以調(diào)用show()函數(shù)來進(jìn)行顯示,但進(jìn)行練習(xí)的時(shí)候(ipython環(huán)境中),一般我們可以省略show()函數(shù),也能自動(dòng)顯示出來。
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是一個(gè)專業(yè)繪圖的庫(kù),相當(dāng)于matlab中的plot,可以設(shè)置多個(gè)figure窗口,設(shè)置figure的標(biāo)題,隱藏坐標(biāo)尺,甚至可以使用subplot在一個(gè)figure中顯示多張圖片。一般我們可以這樣導(dǎo)入matplotlib庫(kù):
import matplotlib.pyplot as plt
也就是說,我們繪圖實(shí)際上用的是matplotlib包的pyplot模塊。
例:分開并同時(shí)顯示宇航員圖片的三個(gè)通道
from skimage import data import matplotlib.pyplot as plt img=data.astronaut() plt.figure(num='astronaut',figsize=(8,8)) #創(chuàng)建一個(gè)名為astronaut的窗口,并設(shè)置大小 plt.subplot(2,2,1) #將窗口分為兩行兩列四個(gè)子圖,則可顯示四幅圖片 plt.title('origin image') #第一幅圖片標(biāo)題 plt.imshow(img) #繪制第一幅圖片 plt.subplot(2,2,2) #第二個(gè)子圖 plt.title('R channel') #第二幅圖片標(biāo)題 plt.imshow(img[:,:,0],plt.cm.gray) #繪制第二幅圖片,且為灰度圖 plt.axis('off') #不顯示坐標(biāo)尺寸 plt.subplot(2,2,3) #第三個(gè)子圖 plt.title('G channel') #第三幅圖片標(biāo)題 plt.imshow(img[:,:,1],plt.cm.gray) #繪制第三幅圖片,且為灰度圖 plt.axis('off') #不顯示坐標(biāo)尺寸 plt.subplot(2,2,4) #第四個(gè)子圖 plt.title('B channel') #第四幅圖片標(biāo)題 plt.imshow(img[:,:,2],plt.cm.gray) #繪制第四幅圖片,且為灰度圖 plt.axis('off') #不顯示坐標(biāo)尺寸 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í)可以不帶任何參數(shù),其中:
num: 整型或字符型都可以。如果設(shè)置為整型,則該整型數(shù)字表示窗口的序號(hào)。如果設(shè)置為字符型,則該字符串表示窗口的名稱。用該參數(shù)來命名窗口,如果兩個(gè)窗口序號(hào)或名相同,則后一個(gè)窗口會(huì)覆蓋前一個(gè)窗口。
figsize: 設(shè)置窗口大小。是一個(gè)tuple型的整數(shù),如figsize=(8,8)
dpi: 整形數(shù)字,表示窗口的分辨率。
facecolor: 窗口的背景顏色。
edgecolor: 窗口的邊框顏色。
用figure()函數(shù)創(chuàng)建的窗口,只能顯示一幅圖片,如果想要顯示多幅圖片,則需要將這個(gè)窗口再劃分為幾個(gè)子圖,在每個(gè)子圖中顯示不同的圖片。我們可以使用subplot()函數(shù)來劃分子圖,函數(shù)格式為:
matplotlib.pyplot.subplot(nrows, ncols, plot_number)
nrows: 子圖的行數(shù)。
ncols: 子圖的列數(shù)。
plot_number: 當(dāng)前子圖的編號(hào)。
如:
plt.subplot(2,2,1)
則表示將figure窗口劃分成了2行2列共4個(gè)子圖,當(dāng)前為第1個(gè)子圖。我們有時(shí)也可以用這種寫法:
plt.subplot(221)
兩種寫法效果是一樣的。每個(gè)子圖的標(biāo)題可用title()函數(shù)來設(shè)置,是否使用坐標(biāo)尺可用axis()函數(shù)來設(shè)置,如:
plt.subplot(221) plt.title("first subwindow") plt.axis('off')
除了上面那種方法創(chuàng)建顯示窗口和劃分子圖,還有另外一種編寫方法也可以,如下例:
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() #自動(dòng)調(diào)整subplot間的參數(shù)
直接用subplots()函數(shù)來創(chuàng)建并劃分窗口。注意,比前面的subplot()函數(shù)多了一個(gè)s,該函數(shù)格式為:
matplotlib.pyplot.subplots(nrows=1, ncols=1)
nrows: 所有子圖行數(shù),默認(rèn)為1。
ncols: 所有子圖列數(shù),默認(rèn)為1。
返回一個(gè)窗口figure, 和一個(gè)tuple型的ax對(duì)象,該對(duì)象包含所有的子圖,可結(jié)合ravel()函數(shù)列出所有子圖,如:
fig, axes = plt.subplots(2, 2, figsize=(7, 6)) ax0, ax1, ax2, ax3 = axes.ravel()
創(chuàng)建了2行2列4個(gè)子圖,分別取名為ax0,ax1,ax2和ax3, 每個(gè)子圖的標(biāo)題用set_title()函數(shù)來設(shè)置,如:
ax0.imshow(img) ax0.set_title("Original image")
如果有多個(gè)子圖,我們還可以使用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í)可省略所有的參數(shù)。
pad: 主窗口邊緣和子圖邊緣間的間距,默認(rèn)為1.08
h_pad, w_pad: 子圖邊緣之間的間距,默認(rèn)為 pad_inches
rect: 一個(gè)矩形區(qū)域,如果設(shè)置這個(gè)值,則將所有的子圖調(diào)整到這個(gè)矩形區(qū)域內(nèi)。
一般調(diào)用為:
plt.tight_layout() #自動(dòng)調(diào)整subplot間的參數(shù)
除了使用matplotlib庫(kù)來繪制圖片,skimage還有另一個(gè)子模塊viewer,也提供一個(gè)函數(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)建一個(gè)顯示窗口 | plt.figure(num=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)建帶有多個(gè)子圖的窗口 | fig,axes=plt.subplots(2,2,figsize=(8,8)) |
ravel | 為每個(gè)子圖設(shè)置變量 | ax0,ax1,ax2,ax3=axes.ravel() |
set_title | 設(shè)置子圖標(biāo)題(與axes結(jié)合使用) | ax0.set_title('first window') |
tight_layout | 自動(dòng)調(diào)整子圖顯示布局 | plt.tight_layout() |
讀到這里,這篇“怎么使用python進(jìn)行圖像繪制”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。