分水嶺演算法詳細步驟 matlab

2021-08-27 01:52:55 字數 3645 閱讀 7135

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

步驟:1.讀取影象

2.求取影象的邊界,在此基礎上可直接應用分水嶺分割演算法,但效果不佳;

3.對影象的前景和背景進行標記,其中每個物件內部的前景畫素都是相連的,背景裡面的每個畫素值都不屬於任何目標物體;

4.計算分割函式,應用分水嶺分割演算法的實現

注:直接用分水嶺分割演算法效果並不好,如果在影象中對前景和背景進行標註區別,再應用分水嶺演算法會取得較好的分割效果。

例 步驟:

1.讀取影象並求取影象的邊界。

rgb = imread('pears.png');%讀取原影象

i = rgb2gray(rgb);%轉化為灰度影象

figure; subplot(121)%顯示灰度影象

imshow(i)

text(732,501,'image courtesy of corel',...

'fontsize',7,'horizontalalignment','right')

hy = fspecial('sobel');%sobel運算元

hx = hy';

iy = imfilter(double(i), hy, 'replicate');%濾波求y方向邊緣

ix = imfilter(double(i), hx, 'replicate');%濾波求x方向邊緣

gradmag = sqrt(ix.^2 + iy.^2);%求摸

subplot(122); imshow(gradmag,), %顯示梯度

title('gradient magnitude (gradmag)')

2. 直接使用梯度模值進行分水嶺演算法:(往往會存在過的分割的情況,效果不好)

l = watershed(gradmag);%直接應用分水嶺演算法

lrgb = label2rgb(l);%轉化為彩色影象

figure; imshow(lrgb), %顯示分割後的影象

title('watershed transform of gradient magnitude (lrgb)')

3.分別對前景和背景進行標記:本例中使用形態學重建技術對前景物件進行標記,首先使用開操作,開操作之後可以去掉一些很小的目標。

se = strel('disk', 20);%圓形結構元素

io = imopen(i, se);%形態學開操作

figure; subplot(121)

imshow(io), %顯示執行開操作後的影象

title('opening (io)')

ie = imerode(i, se);%對影象進行腐蝕

iobr = imreconstruct(ie, i);%形態學重建

subplot(122); imshow(iobr), %顯示重建後的影象

title('opening-by-reconstruction (iobr)')

ioc = imclose(io, se);%形態學關操作

figure; subplot(121)

imshow(ioc), %顯示關操作後的影象

title('opening-closing (ioc)')

iobrd = imdilate(iobr, se);%對影象進行膨脹

iobrcbr = imreconstruct(imcomplement(iobrd), ...

imcomplement(iobr));%形態學重建

iobrcbr = imcomplement(iobrcbr);%影象求反

subplot(122); imshow(iobrcbr), %顯示重建求反後的影象

title('opening-closing by reconstruction (iobrcbr)')

fgm = imregionalmax(iobrcbr);%區域性極大值

figure; imshow(fgm), %顯示重建後區域性極大值影象

title('regional maxima of opening-closing by reconstruction (fgm)')

i2 = i;

i2(fgm) = 255;%區域性極大值處畫素值設為255

figure; imshow(i2), %在原圖上顯示極大值區域

title('regional maxima superimposed on original image (i2)')

se2 = strel(ones(5,5));%結構元素

fgm2 = imclose(fgm, se2);%關操作

fgm3 = imerode(fgm2, se2);%腐蝕

fgm4 = bwareaopen(fgm3, 20);%開操作

i3 = i;

i3(fgm4) = 255;%前景處設定為255

figure; subplot(121)

imshow(i3)%顯示修改後的極大值區域

title('modified regional maxima')

bw = im2bw(iobrcbr, graythresh(iobrcbr));%轉化為二值影象

subplot(122); imshow(bw), %顯示二值影象

title('thresholded opening-closing by reconstruction')

4. 進行分水嶺變換並顯示:

d = bwdist(bw);%計算距離

dl = watershed(d);%分水嶺變換

bgm = dl == 0;%求取分割邊界

figure; imshow(bgm), %顯示分割後的邊界

title('watershed ridge lines (bgm)')

gradmag2 = imimposemin(gradmag, bgm | fgm4);%置最小值

l = watershed(gradmag2);%分水嶺變換

i4 = i;

i4(imdilate(l == 0, ones(3, 3)) | bgm | fgm4) = 255;%前景及邊界處置255

figure; subplot(121)

imshow(i4)%突出前景及邊界

title('markers and object boundaries')

lrgb = label2rgb(l, 'jet', 'w', 'shuffle');%轉化為偽彩色影象

subplot(122); imshow(lrgb)%顯示偽彩色影象

title('colored watershed label matrix')

figure; imshow(i),

hold on

himage = imshow(lrgb);%在原圖上顯示偽彩色影象

set(himage, 'alphadata', 0.3);

title('lrgb superimposed transparently on original image')

一起分享,粘自

分水嶺演算法

分水嶺變換是一種流行的影象處理演算法,用於快速將影象分割成多個同質區域。分水嶺演算法的思想是 把影象看成乙個拓撲地貌,那麼同類區域就相當於陡峭邊緣內相對平坦的盆地。分水嶺演算法通過逐步增加水位,把地貌分割成多個部分 目前比較著名的有模擬泛洪和降水 降水 水先是匯集到海拔低的地區,慢慢填充這每乙個盆地...

分水嶺演算法

在許多實際應用中,我們需要分割影象,但無法從背景影象中獲得有用資訊。分水嶺演算法在這方面往往是非常有效的。此演算法可以將影象中的邊緣轉化成 山脈 將均勻區域轉化為 山谷 這樣有助於分割目標。分水嶺演算法,是一種基於拓撲理論的數學形態學的分割方法,其基本思想是把影象看作是測地學上的拓撲地貌,影象中每一...

分水嶺分割演算法

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