定義
形態學上的擊中或擊不中變換是形狀檢測的基本工具.
擊中擊不中變換(HMT)需要兩個結構元素B1和B2,合成一個結構元素對B=(B1,B2) 一個用於探測圖像內部,作為擊中部分;另一個用於探測圖像外部,作為擊不中部分。顯然,B1和B2是不應該相連接的,即B1∩B2=Φ。擊中擊不中變換的數學表達式為: g(x, y)=hitmiss[f(x, y), B]=erode[f(x, y), B1]AND erode[fc(x, y), B2] 其中,fc(x,y)表示的是f(x,y)的補集。
算法步驟
擊中擊不中變換是形態學中用來檢測特定形狀所處位置的一個基本工具。它的原理就是使用腐蝕;如果要在一幅圖像A上找到B形狀的目標,我們要做的是:
首先,建立一個比B大的模板W;使用此模板對圖像A進行腐蝕,得到圖像假設為Process1;
其次,用B減去W,從而得到V模板(W-B);使用V模板對圖像A的補集進行腐蝕,得到圖像假設為Process2;
然后,Process1與Process2取交集;得到的結果就是B的位置。這里的位置可能不是B的中心位置,要視W-B時對齊的位置而異;
其實很簡單,兩次腐蝕,然后交集,結果就出來了。
圖示
令每種形狀的重心為它的原點。設 D 被包圍在一個小窗口 W 中。與 W 有關的 D 的局部背景定義為集合的差 (W-D)。
如果 B 表示由 D 和 D 的背景構成的集合,則在 A 中對 B 進行的匹配(或匹配操作的集合)表示為:
例子
clc clear f=imread('block.png'); imshow(f); f=rgb2gray(f); title('擊中或不擊中原始圖像'); B1=strel([0 0 0;0 1 1;0 1 0]);%擊中:要求擊中所有1的位置 B2=strel([1 1 1;1 0 0;1 0 0]);%擊不中,要求擊不中所有1的位置 B3=strel([0 1 0;1 1 1;0 1 0]);%擊中 B4=strel([1 0 1;0 0 0;0 0 0]);%擊不中 B5=strel([0 0 0;0 1 0;0 0 0]);%擊中 B6=strel([1 1 1;1 0 0;1 0 0]);%擊不中 g=imerode(f,B1)&imerode(~f,B2)%利用定義來實現擊中或擊不中 figure,subplot(221),imshow(g); title('定義實現組1擊中擊不中圖像'); g1=bwhitmiss(f,B1,B2); subplot(222),imshow(g1); title('結構數組1擊中擊不中后的圖像'); g2=bwhitmiss(f,B3,B4); subplot(223),imshow(g2); title('結構數組2擊中擊不中的圖像'); g3=bwhitmiss(f,B5,B6); subplot(224),imshow(g3); title('結構數組3擊中擊不中的圖像');
如果我們將B2最后一元素改為1,則結果:
會發現利用結構數組1並沒有檢測到形狀。
原因:
我們如果采用B1作為擊中結構元:
可以看到在我們想要確定的正方形其中有擊中元素。
如果采用B2作為擊不中變換,把最后一個0改成1:
可以發現,此時內部並無擊不中元素,於是,最后取交集將沒有任何元素。