如果圖像中的目標物體是連在一起的,則分割起來會更困難,分水嶺算法經常用于處理這類問題,通常會取得比較好的效果。分水嶺分割算法把圖像看成一副“地形圖”,其中亮度比較強的地區像素值較大,而比較暗的地區像素比較小,通過尋找“匯水盆地”和“分水嶺界限”,對圖像進行分割。 步驟: 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') |