分水嶺分割演算法(源自百度)

2021-09-24 10:12:51 字數 2266 閱讀 1549

clear,clc

%三種方法進行分水嶺分割

%讀入影象

filename='sar1.bmp';

f=imread(filename);

info=imfinfo(filename);

if info.bitdepth>8

f=rgb2gray(f);

endfigure,mesh(double(f));%顯示影象,類似集水盆地

%方法1:一般分水嶺分割,從結果可以看出存在過分割問題

b=im2bw(f,graythresh(f));%二值化,注意應保證集水盆地的值較低(為0),否則就要對b取反

d=bwdist(b); %求零值到最近非零值的距離,即集水盆地到分水嶺的距離

l=watershed(-d); %matlab自帶分水嶺演算法,l中的零值即為風水嶺

w=l==0; %取出邊緣

g=b&~w; %用w作為mask從二值影象中取值

figure

subplot(2,3,1),imshow(f);

subplot(2,3,2),imshow(b);

subplot(2,3,3),imshow(d);

subplot(2,3,4),imshow(l);

subplot(2,3,5),imshow(w);

subplot(2,3,6),imshow(g);

%方法2:使用梯度的兩次分水嶺分割,從結果可以看出還存在過分割問題(在方法1的基礎上改進)

h=fspecial('sobel');%獲得縱方向的sobel運算元

fd=double(f);

g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel運算元進行梯度運算

l=watershed(g);%分水嶺運算

wr=l==0;

g2=imclose(imopen(g,ones(3,3)),ones(3,3));%進行開閉運算對影象進行平滑

l2=watershed(g2);%再次進行分水嶺運算

wr2=l2==0;

f2=f;

f2(wr2)=255;

figure

subplot(2,3,1),imshow(f);

subplot(2,3,2),imshow(g);

subplot(2,3,3),imshow(l);

subplot(2,3,4),imshow(g2);

subplot(2,3,5),imshow(l2);

subplot(2,3,6),imshow(f2);

%方法3:使用梯度加掩模的三次分水嶺演算法(在方法2的基礎上改進)

h=fspecial('sobel');%獲得縱方向的sobel運算元

fd=double(f);

g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel運算元進行梯度運算

l=watershed(g);%分水嶺運算

wr=l==0;

rm=imregionalmin(g); %計算影象的區域最小值定位,該函式僅僅是用來觀察為何分水嶺演算法產生這麼多集水盆地

im=imextendedmin(f,2);%上面僅是產生最小值點,而該函式則是得到最小值附近的區域,此處的附近是相差2的區域

fim=f;

fim(im)=175; %將im在原圖上標識出,用以觀察

lim=watershed(bwdist(im));%再次分水嶺計算

em=lim==0;

g2=imimposemin(g,im|em);%在梯度圖上標出im和em,im是集水盆地的中心,em是分水嶺

l2=watershed(g2); %第三次分水嶺計算

f2=f;

f2(l2==0)=255; %從原圖對分水嶺進行觀察

figure

subplot(3,3,1),imshow(f);

subplot(3,3,2),imshow(g);

subplot(3,3,3),imshow(l);

subplot(3,3,4),imshow(im);

subplot(3,3,5),imshow(fim);

subplot(3,3,6),imshow(lim);

subplot(3,3,7),imshow(g2);

subplot(3,3,8),imshow(l2)

subplot(3,3,9),imshow(f2);

分水嶺分割演算法

如果影象中的目標物體是連在一起的,則分割起來會更困難,分水嶺演算法經常用於處理這類問題,通常會取得比較好的效果。分水嶺分割演算法把影象看成一副 地形圖 其中亮度比較強的地區畫素值較大,而比較暗的地區畫素比較小,通過尋找 匯水盆地 和 分水嶺界限 對影象進行分割。步驟 1.讀取影象 2.求取影象的邊界...

分水嶺分割演算法

建立不同目標間的分水嶺 漲水法 分水嶺計算步驟 1 設待分割圖象為f x,y 其梯度圖象為g x,y 2 用m1,m2,mr表示g x,y 中各區域性極小值的象素,位置,c mi 為與mi對應的區域中的象素座標集合 3 用n表示當前灰度閾值,t n 代表記為 u,v 的象素集合,g u,v 4 對m...

分水嶺分割

基於拓撲理論的數學形態學的分割演算法,基本思想是把影象看作是地形地貌,影象中每一點的灰度值表示該點的海拔高度,每乙個區域性極小值及其影響區域成為集水盆,集水盆的邊界則形成分水嶺。在每乙個區域性極小值表面,刺穿乙個小孔,然後慢慢把整個模型浸入水中,隨著浸入的加深,每乙個區域性極小值的影響區域慢慢向外擴...