所謂的最終腐蝕並不是把影象不斷腐蝕直到一片黑為止,那樣還有什麼意思呢。
最終腐蝕的意思是連續腐蝕過程中連通子區域消失前所有剩餘部分的並。
看下圖有乙個連通區域:
那麼最終腐蝕就是把影象不斷腐蝕到只剩圓環最中間的白色區域為止。如下:
所以一般最終腐蝕之後,如果再腐蝕一下,那麼影象就全沒了。
最終腐蝕的通常演算法會先對原影象使用距離變換,然後求區域極大值。不過這種方法怎麼說呢,速度倒是快,不過我實驗了很多次,求得的結果很不穩定。
所以我就自己開發了乙個演算法,雖然有些慢,不過很穩定。
1.首先對原影象進行連通區域標記。
2.對標記後影象不斷進行腐蝕,每腐蝕一次,重新標記連通區域。
3.每腐蝕並且標記一次之後,檢查腐蝕後的影象是否有哪乙個標記的區域消失了,如果消失了,那麼就把消失這一區域的最後一次出現的區域恢復。
4.直到下次腐蝕和這次腐蝕結果一樣,程式結束。
執行效果如下:
原圖:
最終腐蝕:
matlab**如下:
clear all;有了最終腐蝕與條件膨脹,那麼分水嶺演算法的實現也就近在眼前了。close all;
clc;
img=imread('
te.png');
img=img>128
;imshow(img);
[m n]=size(img);
imgn=zeros(m,n);
preimg=imgn;
se= strel('
square
',3);
while sum(sum(preimg-img))~=0
preimg=img;
img=img>0
;
[img
label]=liantong(img); %標記不同區域,label
是區域個數
imgn=imerode(img,se);
%腐蝕之後是否有哪個被標記的區域消失了
hist=zeros(1,label
);
for i=1
:m
for j=1
:n
if imgn(i,j)~=0
hist(imgn(i,j))=imgn(i,j);
endend
end%統計消失區域的標號
h=;for i=1:label
if hist(i)==0
h=[h i];
endend
%如果這個區域消失了,那麼再把這個區域恢復過來
if~isempty(h)
l=length(h);
for i=1
:m
for j=1
:n
for k=1
:l
if img(i,j)==h(k)
imgn(i,j)=img(i,j);
endend
endend
endimg=imgn;
endfigure;
imshow(imdilate(imgn>0,se)); %再膨脹一下好看
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...
matlab練習程式(c c 呼叫matlab)
就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...
matlab練習程式(SUSAN檢測)
susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...