分水嶺分割演算法

2021-05-27 13:52:47 字數 3571 閱讀 7349

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

步驟:

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 設待分割圖象為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...

分水嶺分割

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

分水嶺分割

分水嶺分割利用影象形態學進行影象區域分割。它將影象灰度值看作一幅地形圖,在地形圖的區域性極小值處與地形最低點是連通的,從最低點開始注水,水流會逐漸淹沒地形較低點構成的區域,直到整個影象被淹沒。在這個過程中,通過相關形態學處理,可以實現一幅影象的分水嶺分割。以下gif影象給出了形象說明 影象來自 分水...