文章目錄
- 二值形態學
- 灰度形態學
python圖像處理教程:初步📷插值變換
最基礎的形態學操作有四個,分別是腐蝕、膨脹、開計算和閉計算,【scipy.ndimage】分別實現了二值數組和灰度數組的這四種運算。而針對灰度圖像,【scipy.ndimage】還提供了禮帽、黑帽、形態學梯度和拉普拉斯梯度等操作。
二值形態學
二值圖像中只有0和1兩種元素,故而可將其表示為元素值為 1 1 1的元素位置集合 A = { ( i , j ) ∣ A i j = 1 } A=\{(i,j)\vert A_{ij}=1\} A={(i,j)∣Aij?=1},則腐蝕和膨脹可表示為
A ? B = { ( i , j ) ∣ B i j ? A } A ⊕ B = { ( i , j ) ∣ B i j ∪ A =? ? } \begin{aligned} A\ominus B&=\{(i,j)|B_{ij}\subseteq A\}\\ A\oplus B&=\{(i,j)|B_{ij}\cup A\not=\varnothing\} \end{aligned} A?BA⊕B?={(i,j)∣Bij??A}={(i,j)∣Bij?∪A=?}?
其中 B i j B_{ij} Bij?表示當 B B B的原點在 ( i , j ) (i,j) (i,j)處時,B中所有為1的值的集合。
用結構B腐蝕A,當B的原點平移到圖像A的像元 ( i , j ) (i,j) (i,j)時,若B完全被二者的重疊區域所包圍,則賦值為1,否則賦值為0。更直觀的例子是,如果B中為1的元素位置上,對應的A的像素值也都為1,則 ( i , j ) (i,j) (i,j)處為1。膨脹則與之相反。
開運算和閉運算則是腐蝕、膨脹的疊加,開運算是先腐蝕后膨脹;閉運算是先膨脹后腐蝕。這四種運算的差別如下
二值圖像的腐蝕、膨脹、開、閉運算分別由函數binary_erosion, binary_dilation, binary_opening, binary_closing來是實現,上述繪圖代碼如下。
import numpy as np
import matplotlib.pyplot as plt
import scipy.ndimage as snx = np.zeros([20,20])
x[5:15, 5:15] = 1
x[10:12,10:12] = 0
x[2:4, 2:4] = 1func = {"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()
灰度形態學
【ndimage】中為灰度圖像也提供了腐蝕、膨脹、開、閉運算,只需將二值函數中的binary替換為grey即可。此外,針對灰度圖像,【ndimage】還額外提供了四種運算,如下表所示
函數 | 名稱 | 備注 |
---|---|---|
morphological_gradient | 形態學梯度 | 膨脹圖減去腐蝕圖 |
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()
參數列表
二值函數和灰度函數的參數并不相同,下面以closing
運算為例,二值和灰度函數的所有參數,除了輸入input
之外,二者共有的參數有
structure
為數組類型,表示構造元素,可以理解為是卷積模板output
與輸入相同維度的數組,可以存下結果orgin
過濾器設置,默認為0
二值形態學濾波的其他參數如下
binary_closing(input, iterations=1, mask=None, border_value=0, brute_force=False)
其中
iterations
執行次數mask
掩模數組,為bool類型的數組,對應False
的位置將不會改變border_value
邊緣處的值brute_force
如果為False
,則只有上次迭代中發生變化的值才會更新
grey_closing(input, size=None, footprint=None, mode='reflect', cval=0.0)
size
為濾波模板mode
可選reflect,constant,nearest,mirror, wrap
,邊緣填充方式cval
邊緣填充值