當前位置:吉日网官网 - 傳統節日 - 圖像分割-分水嶺算法

圖像分割-分水嶺算法

名稱:謝謝遠。

學號: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);

標題(“疊加在原圖上的標簽矩陣”);

  • 上一篇:作文《電腦的利與弊》該怎麽寫
  • 下一篇:公司買了OA產品,如何才能順利實施?
  • copyright 2024吉日网官网