學號:19021110366t。
簡介:圖像中的目標物體是連在壹起的,分割起來非常困難。分水嶺分割算法常被用來處理這類問題,通常會取得較好的效果。
嵌入牛鼻:圖像分割和分水嶺算法
嵌入式牛問題:分水嶺算法的具體步驟是什麽?
鑲嵌牛文字:
壹.概述
分水嶺分割算法將圖像視為“地形圖”,其中亮度強的區域像素值較大,而較暗的區域像素值較小。通過尋找“集水盆地”和“分水嶺邊界”,圖像被分割。但是,直接應用分水嶺分割算法的效果往往並不好。如果在圖像中區分前景物體和背景物體,分水嶺算法會取得更好的分割效果。基於標記控制的分水嶺分割方法的基本步驟如下:
1?總結
分水嶺分割算法將圖像視為“地形圖”,其中亮度強的區域像素值較大,而較暗的區域像素值較小。通過尋找“集水盆地”和“分水嶺邊界”,圖像被分割。直接應用分水嶺分割算法效果往往不好。如果在圖像中區分前景物體和背景物體,分水嶺算法會取得更好的分割效果。基於標記控制的分水嶺分割方法的基本步驟如下:
1.計算配分函數。圖像中較暗的區域是要分割的對象。
2.計算前景標誌。這些是連接在每個物體內部的斑點像素。
3.計算背景標記。這些元素不屬於任何對象。
4.修改分段函數,使其僅在前景和背景標記位置具有最小值。
5.對修改後的分割函數進行分水嶺變換計算。
使用MATLAB圖像處理工具箱
註意:這期間使用了很多圖像處理工具箱的函數,如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函數。
2?步驟
?第壹步:讀入彩色圖像,轉換成灰度圖像。
clc全部清除;全部關閉;
RGB = im read(' pears . png ');
如果ndims(rgb) == 3
?I = RGB 2 gray(RGB);
其他
?I = rgb
結束
figure('單位','歸壹化','位置',[0 0 1 1]);
第二步:取梯度幅度作為分割函數。
利用sobel邊緣算子對圖像進行水平和垂直方向的濾波,然後計算模值。經過Sobel算子濾波後的圖像會在邊界處表現出比較大的值,而在邊界處的值會很小。
hy = f special(' Sobel ');
hx = hy ';
Iy = imfilter(double(I),hy,' replicate ');
Ix = imfilter(double(I),hx,' replicate ');
gradmag = sqrt(Ix。^2 + Iy。^2);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);Imshow(I,[]),標題(“灰度圖像”)
支線劇情(1,2,2);Imshow(gradmag,[]),標題(“梯度振幅圖像”)
分水嶺算法可以直接用於梯度幅度圖像嗎?
L =分水嶺(grad mag);
lrgb = label 2 RGB(L);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);Imshow(gradmag,[]),標題(“梯度振幅圖像”)
支線劇情(1,2,2);imshow(Lrgb);標題(“梯度振幅的分水嶺變換”)
直接利用梯度模圖像的分水嶺算法得到的結果往往存在過度分割。因此,通常需要分別標記前景對象和背景對象,以獲得更好的分割效果。
第三步:標記前景物體。
這裏可以應用許多方法來獲得前景標記,這些標記必須是前景對象內部的連接斑點像素。在這個例子中,形態學技術“基於開的重建”和“基於閉的重建”將被用於清理圖像。這些操作將在每個對象內創建壹個單位最大值,以便可以使用imregionalmax來定位它。
開式操作和閉式操作:先腐蝕後膨脹稱為開式操作;腐蝕前的膨脹稱為閉合。開閉操作可以去除比結構元素更小的特定圖像細節,同時保證不會發生全局幾何畸變。開運算可以過濾掉比結構元素小的尖峰,切斷細長的重疊,起到分離的作用;封閉操作可以填充比結構元素小的縫隙或孔洞,重疊短的間隔,起到連接作用。
開運算是腐蝕後的擴張,開基重建(基於重建的開運算)是腐蝕後的形態重建。我們來比較壹下這兩種方式。首先用imopen做打開操作。
se = strel('disk ',20);
Io = imopen(I,se);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(I,[]);標題(“灰度圖像”);
支線劇情(1,2,2);Imshow(Io),標題(“操作中的圖像”)
接下來,通過腐蝕後的重建來進行基於開口的重建計算。
Ie = imerode(I,se)
Iobr = imreconstruct(即I);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(I,[]);標題(“灰度圖像”);
支線劇情(1,2,2);Imshow(Iobr,[]),標題(“基於開放的重建圖像”)
打開操作後,暗點和分支標記可通過關閉操作去除。比較傳統的形態學閉運算和基於閉運算的重建運算。首先,使用imclose:
Ioc = imclose(Io,se);
Ic = inclose(I,se);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(I,[]);標題(“灰度圖像”);
支線劇情(2,2,2);imshow(Io,[]);標題(“打開操作圖像”);
支線劇情(2,2,3);imshow(Ic,[]);標題(“關閉操作圖像”);
支線劇情(2,2,4);Imshow(Ioc,[]),title('開閉操作');
現在使用imdilate,然後使用imreconstruct。註意,必須補充輸入圖像,並且必須補充imreconstruct輸出圖像。IM2 = IMcomplement(IM)計算圖像IM的補碼。IM可以是二進制圖像或RGB圖像。IM2和IM具有相同的數據類型和大小。
io brd = im dilat(Iobr,se);
iobrcbr = im reconstruct(im complement(Iobrd),im complement(Iobr));
Iobrcbr = im complement(Iobrcbr);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(I,[]);標題(“灰度圖像”);
支線劇情(2,2,2);imshow(Ioc,[]);標題(“打開和關閉操作”);
支線劇情(2,2,3);imshow(Iobr,[]);標題(“基於開放的重建圖像”);
支線劇情(2,2,4);Imshow(Iobrcbr,[]),title('閉基重建圖像');
通過比較Iobrcbr和loc可以看出,在不影響物體全局形狀的情況下,去除小汙點的應用下,基於重建的開閉操作比標準的開閉重建更有效。計算Iobrcbr的局部最大值以獲得更好的前景標記。
FGM = imregionalmax(Iobrcbr);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,3,1);imshow(I,[]);標題(“灰度圖像”);
支線劇情(1,3,2);imshow(Iobrcbr,[]);標題(“基於重構的開閉操作”);
支線劇情(1,3,3);imshow(fgm,[]);標題(“局部最大圖像”);
為了幫助理解這個結果,前景標記被疊加在原始圖像上。
It1 = rgb(:,:,1);
It2 = rgb(:,:,2);
It3 = rgb(:,:,3);
it 1(FGM)= 255;it2(FGM)= 0;it3(FGM)= 0;
I2 = cat(3,It1,It2,It3);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(rgb,[]);標題(“原圖”);
支線劇情(2,2,2);imshow(Iobrcbr,[]);標題(“基於重構的開閉操作”);
支線劇情(2,2,3);imshow(fgm,[]);標題(“局部最大圖像”);
支線劇情(2,2,4);imshow(I2);標題('局部最大疊加到原圖');
請註意,大多數遮擋和陰影對象都沒有標記,這意味著這些對象在結果中不會被合理地分割。此外,壹些對象的前景標記將壹直到對象的邊緣。這意味著標記點的邊緣應該被清潔,然後收縮。可以通過閉合操作和蝕刻操作來完成。
se2 = strel(ones(5,5));
fgm2 = imclose(fgm,se2);
fgm3 = imerode(fgm2,se2);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(Iobrcbr,[]);標題(“基於重構的開閉操作”);
支線劇情(2,2,2);imshow(fgm,[]);標題(“局部最大圖像”);
支線劇情(2,2,3);imshow(fgm2,[]);標題(“關閉操作”);
支線劇情(2,2,4);imshow(fgm3,[]);標題(“腐蝕操作”);
這個過程會留下壹些偏離的孤立像素,應該去除。您可以使用bwareaopen來移除少於特定像素數的斑點。BW2 = bwareaopen(BW,P)從二值圖像中去除值小於P個像素的連通塊,得到另壹幅二值圖像BW2。
fgm4 = bwareaopen(fgm3,20);
It1 = rgb(:,:,1);
It2 = rgb(:,:,2);
It3 = rgb(:,:,3);
it 1(FGM 4)= 255;it2(FGM 4)= 0;it3(FGM 4)= 0;
I3 = cat(3,It1,It2,It3);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(I2,[]);標題('局部最大疊加到原圖');
支線劇情(2,2,2);imshow(fgm3,[]);標題(“封閉腐蝕操作”);
支線劇情(2,2,3);imshow(fgm4,[]);標題(“小斑點去除操作”);
支線劇情(2,2,4);imshow(I3,[]);標題('修改局部最大值疊加到原圖');
第四步:計算背景標記。
現在,妳需要標記背景。在清理後的圖像Iobrcbr中,暗像素屬於背景,可以從閾值操作入手。
bw =im2bw(Iobrcbr,gray thresh(Iobrcbr));
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(Iobrcbr,[]);標題(“基於重構的開閉操作”);
支線劇情(1,2,2);imshow(bw,[]);標題(“閾值分割”);
背景像素在黑色區域中,但是理想地,不需要背景標記太靠近要分割的對象的邊緣。通過計算“骨架影響範圍”,對SKIZ和bw的背景,或者說前景進行“細化”。這可以通過計算bw的距離變換的分水嶺變換,然後求結果的分水嶺脊線(DL==0)來實現。D = BWdist(BW)計算二值圖像BW的歐幾裏德矩陣。對於BW的每個像素,距離變換指定該像素與BW的最近非零像素之間的距離。默認情況下,Bwdist使用歐幾裏德距離公式。BW可以有任意維數,D和BW大小相同。
d = bw dist(bw);
DL =分水嶺(D);
bgm = DL = = 0;
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(2,2,1);imshow(Iobrcbr,[]);標題(“基於重構的開閉操作”);
支線劇情(2,2,2);imshow(bw,[]);標題(“閾值分割”);
支線劇情(2,2,3);imshow(label2rgb(DL),[]);標題('分水嶺變換圖');
支線劇情(2,2,4);imshow(bgm,[]);標題(‘分水嶺變換嶺圖’);
步驟5:計算分割函數的分水嶺變換。
函數imimposemin可用於修改圖像,使其僅在特定的所需位置具有局部最小值。這裏可以使用Imimposemin來修改梯度幅度圖像,以便它只在前景和背景標記像素中具有局部最小值。
gradmag2 = imimposemin(gradmag,bgm | FGM 4);
figure('單位','歸壹化','位置',[0 0 1 1]);
子劇情(2,2,1)imshow(bgm,[]);標題(‘分水嶺變換嶺圖’);
支線劇情(2,2,2);imshow(fgm4,[]);標題(“前景標記”);
支線劇情(2,2,3);imshow(gradmag,[]);標題(“梯度振幅圖像”);
支線劇情(2,2,4);imshow(gradmag2,[]);標題('修改梯度振幅圖像');
最後可以做基於分水嶺的圖像分割計算。
第六步:查看結果
壹種可視化技術是將前景標記、背景標記和分割對象邊界疊加到初始圖像上。您可以使用膨脹來實現某些要求,如對象邊界,這是更清晰可見的。對象邊界位於L==0處。
It1 = rgb(:,:,1);
It2 = rgb(:,:,2);
It3 = rgb(:,:,3);
FGM 5 = im dilat(L = = 0,ones(3,3))| bgm | FGM 4;
it 1(FGM 5)= 255;it2(FGM 5)= 0;it3(FGM 5)= 0;
I4 = cat(3,It1,It2,It3);
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(rgb,[]);標題(“原圖”);
支線劇情(1,2,2);imshow(I4,[]);Title('標簽和對象邊緣疊加在原圖上');
可視化顯示前景和背景標記如何影響結果。在幾個位置,壹些較暗的對象與其相鄰的較亮的相鄰對象合並,因為被遮擋的對象沒有前景標記。
另壹種有用的可視化技術是將標記矩陣顯示為彩色圖像。使用label2rgb顯示,可以將標記矩陣(如watershed和bwlabel獲得的標記矩陣)轉換為真彩色圖像。
Lrgb = label2rgb(L,'噴氣機',' w ','洗牌');
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(rgb,[]);標題(“原圖”);
支線劇情(1,2,2);imshow(Lrgb);標題(“彩色分水嶺標記矩陣”);
透明度可用於覆蓋該偽彩色標記矩陣,並將其顯示在原始亮度圖像上。
figure('單位','歸壹化','位置',[0 0 1 1]);
支線劇情(1,2,1);imshow(rgb,[]);標題(“原圖”);
支線劇情(1,2,2);imshow(rgb,[]);堅持住;
hi mage = im show(Lrgb);
set(himage,' AlphaData ',0.3);
標題(“疊加在原圖上的標簽矩陣”);