本文主要包括如下內容 算法
「骨架」是指一副圖像的骨髓部分,它描述物體的幾何形狀和拓撲結構,是重要的圖像描繪子之一,計算骨架的過程通常稱爲「細化」或「骨架化」,在包括文字識別、工業零件形狀識別以及印刷電路板自動檢測在內的不少應用中,細化過程都發揮着關鍵做用。一般,對咱們感興趣的目標物體進行細化有助於突出目標的形狀特色和拓撲結構而且減小冗餘的信息量。bash
細化適用於和物體拓撲結構或形狀有關的應用, 如前述的手寫字符識別。 但有時咱們關心的是目標對象是否存在、 它們的位置關係, 或者個數, 這時在預處理中加入像素化步驟會給後續的圖像分析帶來極大的方便 markdown
理論基礎
像素化操做首先需找到二值圖像中全部的連通區域, 而後用這些區域的質心做爲這些連通區域的表明, 即將1個連通區域像素化爲位於區域質心位置的1個像素。
有時還能夠進一步引入一個低閥值lowerThres和一個高闕值highThres來指出圖像中咱們感興趣的對象連通數(連通份量中的像素數目)的大體範圍, 從而只像素化圖像中大小介於lowerThres和upperThres之間的連通區域, 而連通數低於lowerThres或高於upperThres的對象都將被濾除, 這就至關於使用算法的同時具備了過濾噪聲的能力。如圖8.29 所示。
函數
若是鏈接物體A內任意兩點的直線段都在淫的內部,則稱d是凸的。任意物體A的凸亮H是包含A的最小凸物體。
咱們老是但願像素化算法可以找到物體的質心來表明讀物體,但在實際中,可能因爲光照不均等緣由致使圖像在二值化後,物體自己形狀發生缺損,像素化算法就沒法找到物體真正的質心。此時可適當地進行凸殼處理,彌補凹損,算法會找到包含原始形狀的最小凸多邊形,以下圖8.30所示.
爲確保在上述生長過程當中凸殼不會大幅超出凸性所需的最小尺寸, 能夠限制其生長以便凸殼不會超出初始時包含物體A的最小矩形. 學習
bwmorph函數
本章的不少形態學操做均可由IPT函數bwmorph實現, 該函數的調用語法爲:
Iout = bwmorph(I,operation,n);
operation是一個指定操做類型的字符串, 經常使用的合法取位如在8.2 所示
ui
本節就們把二值圖像的形態學處理擴展到灰度圖像的基本操做, 包括灰度膨脹、灰皮腐蝕、灰度開和灰皮閉。此外, 8.4.4 小節還將介紹一個灰度形態學的經典應用一一頂帽變換(top-hat), 用以解決圖像的光照不均問題. spa
matlab實現
只要以灰度圖像和相應的灰度膨脹結構元素爲參數調用imdilate函數便可實現灰度膨脹,平坦結構元素的建立方法與二值形態學中相同:而非平坦結構元素也可經過 strel函數以以下方式建立。
SE = strel(NHOOD,HEIGHT);
NHOOD 爲指明結構元素定義域的矩陣, 只能由0和1 組成.
HEIGHT 是一個與NHOOD 具備相同尺寸的矩陣, 指出了對應於NHOOD 中每一個元素的高度. 3d
f = [0 1 2 3 4 5 4 3 2 1 0];
figure,h_f = plot(f);
seFlat = strel([1 1 1]);
fd1 = imdilate(f,seFlat);
hold on,h_fd1 = plot(fd1,'-ro');
axis([1 11 0 8]);
setHeight = strel([1 1 1],[1 1 1]);
fd2 = imdilate(f,setHeight);
hold on,h_fd2= plot(fd2,'-g*');
legend('原灰度1維函數f','使用平坦結構元素膨脹','使用高度爲1有結構元素膨脹元素膨脹後');
與二值形態學不一樣的是,f(x,y)和 S(x,y)再也不是隻表明形狀的集合,而是二維函數,它們的定義域指明瞭其形狀, 它們的值指出了高度信息。 code
f = [0 1 2 3 4 5 4 3 2 1 0];
figure,h_f = plot(f);
seFlat = strel([1 1 1]);
fe1 = imerode(f,seFlat);
hold on,h_fe1 = plot(fe1,'ro');
axis([1 11 0 8]);
seHeight = strel([1 1 1],[1 1 1]);
fe2 = imerode(f,seHeight);
hold on,h_fe2=plot(fe2,'-g*');
legend('原灰度1維函數f','使用平坦結構元素腐蝕','使用高度爲1有結構元素膨脹元素腐蝕後');
灰度膨脹和灰度腐蝕的效果比較 orm
I = imread('lena.bmp');
seHeight=strel(ones(3,3),ones(3,3));
Idi1= imdilate(I,seHeight);
Iero = imerode(I,seHeight);
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(Idi1);
subplot(1,3,3),imshow(Iero);
咱們看到在結構元素的值均大於零的狀況下, 灰度膨脹的輸出圖像整體上比輸入圖像更亮,這是局部最大值運算做用的結果。此外原圖像中一些可以包含於結構元素的暗細節〈如
一部分帽子的槽皺和尾穗)被徹底消除, 其他的大部分暗部細節也都獲得了必定程度上的減小。而灰度腐蝕的做用正好相反, 輸出圖像比輸入圖像更暗, 若是輸入圖像中的亮部細節比結構元素小, 則亮度會獲得削弱。
與二值形態學相似,咱們能夠在灰度腐蝕和膨脹的基礎上定義灰度開和閉運算.灰度開運算就是先灰度腐蝕後灰度膨脹,而灰度閉運算則是先灰度膨脹後灰度腐蝕,下面分別給出定義:
這一過程: (a)爲圖像中的一條水平像素線:(b)和(d)分別給出了球緊貼着該像素線的下側和上側被動的狀況:而(c)和(e)則展現了滾動過程當中球的最高點造成的曲線,它們分別是開、閉運算的結果。
Matlab實現
使用imopen和imdilate一樣能夠對灰度圖像進行開、閉運算, 用法與灰度腐蝕和膨脹相似, 這裏再也不贅述,在實際應用中, 開操做經常用於去除那些相對於結構元素s而言較小的高灰度區域〈球體滾不上去〉,而對於較大的亮區域影響不大〈球體能夠滾上去〉。雖然首先進行的灰度腐蝕
會在去除圖像細節的同時使得總體灰度降低, 但隨後的灰度膨脹又會加強圖像的總體亮度,所以圖像的總體灰度基本保持不變:而閉操做經常使用於去除圖像中的暗細節部分, 而相對地保留高灰度部分不受影響.
做爲灰度形態學的重要應用之一, 這裏學習一種非均勻光照問題的解決方案一一頂帽變換技術(top-hat).圖像f的頂帽變換h定義爲圖像f與圖像f的開運算之差, 可表示爲:
h = f -(f*s)
I = imread('rice.png');
subplot(2,4,1),imshow(I,[]);
thresh = graythresh(I);
Ibw = im2bw(I,thresh);
subplot(2,4,2),imshow(Ibw,[]);
subplot(2,4,3),surf(double(I(1:8:end,1:8:end))),zlim([0 255]),colormap;
bg = imopen(I,strel('disk',15));
subplot(2,4,4),surf(double(bg(1:8:end,1:8:end))),zlim([0 255]),colormap;
Itophat = imsubtract(I,bg);
subplot(2,4,5),imshow(Itophat);
subplot(2,4,6),surf(double(Itophat(1:8:end,1:8:end))),zlim([0 255]);
I2 = imadjust(Itophat);
subplot(2,4,7),imshow(I2);
thresh2 = graythresh(I2);
Ibw2 = im2bw(I2,thresh2);
subplot(2,4,8),imshow(Ibw2);