Python進(jìn)行常見(jiàn)圖像形態(tài)學(xué)處理操作的示例代碼
最基礎(chǔ)的形態(tài)學(xué)操作有四個(gè),分別是腐蝕、膨脹、開計(jì)算和閉計(jì)算,【scipy.ndimage】分別實(shí)現(xiàn)了二值數(shù)組和灰度數(shù)組的這四種運(yùn)算。而針對(duì)灰度圖像,【scipy.ndimage】還提供了禮帽、黑帽、形態(tài)學(xué)梯度和拉普拉斯梯度等操作。
二值形態(tài)學(xué)
二值圖像中只有0和1兩種元素,故而可將其表示為元素值為1的元素位置集合A={(i,j)∣Aij?=1},則腐蝕和膨脹可表示為
A?B={(i,j)∣Bij?⊆A}
A⊕B?={(i,j)∣Bij?∪A≠∅}?
其中Bij表示當(dāng)B的原點(diǎn)在(i,j)處時(shí),B中所有為1的值的集合。
用結(jié)構(gòu)B腐蝕A,當(dāng)B的原點(diǎn)平移到圖像A的像元(i,j)時(shí),若B完全被二者的重疊區(qū)域所包圍,則賦值為1,否則賦值為0。更直觀的例子是,如果B中為1的元素位置上,對(duì)應(yīng)的A的像素值也都為1,則(i,j)處為1。膨脹則與之相反。
開運(yùn)算和閉運(yùn)算則是腐蝕、膨脹的疊加,開運(yùn)算是先腐蝕后膨脹;閉運(yùn)算是先膨脹后腐蝕。這四種運(yùn)算的差別如下
二值圖像的腐蝕、膨脹、開、閉運(yùn)算分別由函數(shù)binary_erosion, binary_dilation, binary_opening, binary_closing來(lái)是實(shí)現(xiàn),上述繪圖代碼如下。
import numpy as np import matplotlib.pyplot as plt import scipy.ndimage as sn x = np.zeros([20,20]) x[5:15, 5:15] = 1 x[10:12,10:12] = 0 x[2:4, 2:4] = 1 func = { "origin": lambda x : x, "erosion": sn.binary_erosion, "dilation": sn.binary_dilation, "opening": sn.binary_opening, "closing": sn.binary_closing } fig = plt.figure() for i,key in enumerate(func): ax = fig.add_subplot(2,3,i+1) ax.imshow(func[key](x)) plt.title(key) plt.show()
灰度形態(tài)學(xué)
【ndimage】中為灰度圖像也提供了腐蝕、膨脹、開、閉運(yùn)算,只需將二值函數(shù)中的binary替換為grey即可。此外,針對(duì)灰度圖像,【ndimage】還額外提供了四種運(yùn)算,如下表所示
函數(shù) | 名稱 | 備注 |
---|---|---|
morphological_gradient | 形態(tài)學(xué)梯度 | 膨脹圖減去腐蝕圖 |
white_tophat | 禮帽(頂帽)運(yùn)算 | 原圖減去開運(yùn)算 |
black_tophat | 黑帽(底帽)運(yùn)算 | 原圖減去閉運(yùn)算 |
morphological_laplace | 拉普拉斯變換 |
這些方法的差異如下
繪圖代碼如下。
from scipy.misc import ascent img = ascent() funcs = { "original": lambda x, tmp:x, "erosion" : sn.grey_erosion, "dilation" : sn.grey_dilation, "opening" : sn.grey_opening, "closing" : sn.grey_closing } fig = plt.figure() for i, key in enumerate(funcs): ax = fig.add_subplot(2,5,i+1) plt.imshow(funcs[key](img, (10,10)), cmap=plt.cm.gray) plt.axis('off') plt.title(key) ori = img[350:500, 400:500] funcs = { "ori": lambda x, tmp:x, "white" : sn.white_tophat, "black" : sn.black_tophat, "gradient" : sn.morphological_gradient, "laplace" : sn.morphological_laplace, } for i, key in enumerate(funcs): ax = fig.add_subplot(2,5,i+6) plt.imshow(funcs[key](ori, (5,5)), cmap=plt.cm.gray) plt.title(key) plt.axis('off') plt.show()
參數(shù)列表
二值函數(shù)和灰度函數(shù)的參數(shù)并不相同,下面以closing運(yùn)算為例,二值和灰度函數(shù)的所有參數(shù),除了輸入input之外,二者共有的參數(shù)有
structure 為數(shù)組類型,表示構(gòu)造元素,可以理解為是卷積模板
output 與輸入相同維度的數(shù)組,可以存下結(jié)果
orgin 過(guò)濾器設(shè)置,默認(rèn)為0
二值形態(tài)學(xué)濾波的其他參數(shù)如下
binary_closing(input, iterations=1, mask=None, border_value=0, brute_force=False)
其中
iterations 執(zhí)行次數(shù)
mask 掩模數(shù)組,為bool類型的數(shù)組,對(duì)應(yīng)False的位置將不會(huì)改變
border_value 邊緣處的值
brute_force 如果為False,則只有上次迭代中發(fā)生變化的值才會(huì)更新
grey_closing(input, size=None, footprint=None, mode='reflect', cval=0.0)
size 為濾波模板
mode 可選reflect,constant,nearest,mirror, wrap,邊緣填充方式
cval 邊緣填充值
到此這篇關(guān)于Python進(jìn)行常見(jiàn)圖像形態(tài)學(xué)處理操作的示例代碼的文章就介紹到這了,更多相關(guān)Python圖像形態(tài)學(xué)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python分割單詞和轉(zhuǎn)換命名法的實(shí)現(xiàn)
本文主要介紹了Python分割單詞和轉(zhuǎn)換命名法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python實(shí)現(xiàn)圖像增強(qiáng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖像增強(qiáng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08python plt.plot bar 如何設(shè)置繪圖尺寸大小
這篇文章主要介紹了python plt.plot bar 設(shè)置繪圖尺寸大小的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Python實(shí)現(xiàn)扣除個(gè)人稅后的工資計(jì)算器示例
這篇文章主要介紹了Python實(shí)現(xiàn)扣除個(gè)人稅后的工資計(jì)算器,涉及Python流程控制與數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-03-03python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例
今天小編就為大家分享一篇python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python異常模塊traceback用法實(shí)例分析
這篇文章主要介紹了Python異常模塊traceback用法,結(jié)合實(shí)例形式分析了Python異常模塊traceback的基本功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10Python繼承和子類從Person到Student演示實(shí)例
這篇文章主要為大家介紹了Python繼承和子類從Person到Student演示實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10