Python進行常見圖像形態(tài)學處理操作的示例代碼
最基礎(chǔ)的形態(tài)學操作有四個,分別是腐蝕、膨脹、開計算和閉計算,【scipy.ndimage】分別實現(xiàn)了二值數(shù)組和灰度數(shù)組的這四種運算。而針對灰度圖像,【scipy.ndimage】還提供了禮帽、黑帽、形態(tài)學梯度和拉普拉斯梯度等操作。
二值形態(tài)學
二值圖像中只有0和1兩種元素,故而可將其表示為元素值為1的元素位置集合A={(i,j)∣Aij?=1},則腐蝕和膨脹可表示為
A?B={(i,j)∣Bij?⊆A}
A⊕B?={(i,j)∣Bij?∪A≠∅}?
其中Bij表示當B的原點在(i,j)處時,B中所有為1的值的集合。
用結(jié)構(gòu)B腐蝕A,當B的原點平移到圖像A的像元(i,j)時,若B完全被二者的重疊區(qū)域所包圍,則賦值為1,否則賦值為0。更直觀的例子是,如果B中為1的元素位置上,對應(yīng)的A的像素值也都為1,則(i,j)處為1。膨脹則與之相反。
開運算和閉運算則是腐蝕、膨脹的疊加,開運算是先腐蝕后膨脹;閉運算是先膨脹后腐蝕。這四種運算的差別如下
二值圖像的腐蝕、膨脹、開、閉運算分別由函數(shù)binary_erosion, binary_dilation, binary_opening, binary_closing來是實現(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)學
【ndimage】中為灰度圖像也提供了腐蝕、膨脹、開、閉運算,只需將二值函數(shù)中的binary替換為grey即可。此外,針對灰度圖像,【ndimage】還額外提供了四種運算,如下表所示
函數(shù) | 名稱 | 備注 |
---|---|---|
morphological_gradient | 形態(tài)學梯度 | 膨脹圖減去腐蝕圖 |
white_tophat | 禮帽(頂帽)運算 | 原圖減去開運算 |
black_tophat | 黑帽(底帽)運算 | 原圖減去閉運算 |
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運算為例,二值和灰度函數(shù)的所有參數(shù),除了輸入input之外,二者共有的參數(shù)有
structure 為數(shù)組類型,表示構(gòu)造元素,可以理解為是卷積模板
output 與輸入相同維度的數(shù)組,可以存下結(jié)果
orgin 過濾器設(shè)置,默認為0
二值形態(tài)學濾波的其他參數(shù)如下
binary_closing(input, iterations=1, mask=None, border_value=0, brute_force=False)
其中
iterations 執(zhí)行次數(shù)
mask 掩模數(shù)組,為bool類型的數(shù)組,對應(yīng)False的位置將不會改變
border_value 邊緣處的值
brute_force 如果為False,則只有上次迭代中發(fā)生變化的值才會更新
grey_closing(input, size=None, footprint=None, mode='reflect', cval=0.0)
size 為濾波模板
mode 可選reflect,constant,nearest,mirror, wrap,邊緣填充方式
cval 邊緣填充值
到此這篇關(guān)于Python進行常見圖像形態(tài)學處理操作的示例代碼的文章就介紹到這了,更多相關(guān)Python圖像形態(tài)學處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python分割單詞和轉(zhuǎn)換命名法的實現(xiàn)
本文主要介紹了Python分割單詞和轉(zhuǎn)換命名法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03python plt.plot bar 如何設(shè)置繪圖尺寸大小
這篇文章主要介紹了python plt.plot bar 設(shè)置繪圖尺寸大小的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06python生成多個只含0,1元素的隨機數(shù)組或列表的實例
今天小編就為大家分享一篇python生成多個只含0,1元素的隨機數(shù)組或列表的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python繼承和子類從Person到Student演示實例
這篇文章主要為大家介紹了Python繼承和子類從Person到Student演示實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10