本示例說明了如何使用分水嶺分割來分離影象中的物體。分水嶺變換透過將影象視為亮畫素高而暗畫素低的表面,在影象中找到“集水盆地”和“分水嶺脊線”。
如果您可以識別或“標記”前景物體和背景位置,則使用分水嶺變換進行分割會更好。標記控制的分水嶺分割遵循以下基本過程:
計算分割函式。這是一張影象,其暗區是您要分割的物體。
計算前景標記。這些是每個物體中畫素的連通域。
計算背景標記。這些是不屬於任何物體的畫素。
修改分割函式,使其僅在前景和背景標記位置具有最小值。
計算修改後的分割函式的分水嶺變換。
步驟1:讀取彩色影象並將其轉換為灰度
rgb
=
imread
(
‘pears。png’
);
I
=
rgb2gray
(
rgb
);
imshow
(
I
)
text
(
732
,
501
,
‘Image courtesy of Corel(R)’
,
。。。
‘FontSize’
,
7
,
‘HorizontalAlignment’
,
‘right’
)
步驟2:使用梯度幅度作為分割函式
計算梯度幅度。梯度在物體邊界處較高,而在物體內部的梯度較低(大部分)。
gmag
=
imgradient
(
I
);
imshow
(
gmag
,[])
title
(
‘Gradient Magnitude’
)
您是否可以直接在梯度幅度上使用分水嶺變換對影象進行分割?
L
=
watershed
(
gmag
);
Lrgb
=
label2rgb
(
L
);
imshow
(
Lrgb
)
title
(
‘Watershed Transform of Gradient Magnitude’
)
不行。如果不進行其他預處理(例如下面的標記計算),則直接使用分水嶺變換通常會導致“過度分割”。
步驟3:標記前景物體
在這裡可以應用各種過程來找到前景標記,這些前景標記必須與每個前景物體內部的畫素區域相連。在此示例中,您將使用稱為“開重建”和“閉重建”的形態學技術“清理”影象。這些操作用
imregionalmax
將在每個可使用定位的物體內建立平坦的最大值。
開操作是腐蝕然後是膨脹,而開重建是腐蝕然後是形態學重建。讓我們比較一下兩者。首先,使用開操作
imopen
。
se
=
strel
(
‘disk’
,
20
);
Io
=
imopen
(
I
,
se
);
imshow
(
Io
)
title
(
‘Opening’
)
接下來,使用
imerode
和
imreconstruct
計算開重建。
Ie
=
imerode
(
I
,
se
);
Iobr
=
imreconstruct
(
Ie
,
I
);
imshow
(
Iobr
)
title
(
‘Opening-by-Reconstruction’
)
開操作後可以用閉操作消除黑點和莖幹痕跡。比較常規形態學閉操作與閉重建。首先嚐試
imclose
:
Ioc
=
imclose
(
Io
,
se
);
imshow
(
Ioc
)
title
(
‘Opening-Closing’
)
現在使用
imdilate
之後再用
imreconstruct
。請注意,您必須對
imreconstruct
影象的輸入和輸出進行補集操作。
Iobrd
=
imdilate
(
Iobr
,
se
);
Iobrcbr
=
imreconstruct
(
imcomplement
(
Iobrd
),
imcomplement
(
Iobr
));
Iobrcbr
=
imcomplement
(
Iobrcbr
);
imshow
(
Iobrcbr
)
title
(
‘Opening-Closing by Reconstruction’
)
如你所見,可以用
Ioc
比較
Iobrcbr
,在不影響物體的總體形狀的條件下消除小瑕疵,基於重建的開和閉比標準的開操作和閉操作更加有效。計算
Iobrcbr
的區域最大值以獲得良好的前景標記。
fgm
=
imregionalmax
(
Iobrcbr
);
imshow
(
fgm
)
title
(
‘Regional Maxima of Opening-Closing by Reconstruction’
)
為了幫助解釋結果,請將前景標記影象疊加在原始影象上。
I2
=
labeloverlay
(
I
,
fgm
);
imshow
(
I2
)
title
(
‘Regional Maxima Superimposed on Original Image’
)
請注意,某些未完全遮蓋和陰影的物體未標記,這意味著在最終結果中將無法正確分割這些物體。此外,某些物件中的前景標記會一直向上延伸到物件的邊緣。這意味著您應該清理標記斑點的邊緣,然後將其縮小一點。您可以先閉操作再進行侵蝕操作。
se2
=
strel
(
ones
(
5
,
5
));
fgm2
=
imclose
(
fgm
,
se2
);
fgm3
=
imerode
(
fgm2
,
se2
);
此過程往往會留下一些必須隔離的雜散孤立畫素。您可以使用
bwareaopen
來執行此操作,該操作會刪除畫素少於一定數量的所有斑點。
fgm4
=
bwareaopen
(
fgm3
,
20
);
I3
=
labeloverlay
(
I
,
fgm4
);
imshow
(
I3
)
title
(
‘Modified Regional Maxima Superimposed on Original Image’
)
步驟4:計算背景標記
現在您需要標記背景。在清理後的影象
Iobrcbr
中,黑色畫素屬於背景,因此您可以從閾值操作開始。
bw
=
imbinarize
(
Iobrcbr
);
imshow
(
bw
)
title
(
‘Thresholded Opening-Closing by Reconstruction’
)
背景畫素為黑色,但理想情況下,我們不希望背景標記離我們要分割的物件的邊緣太近。我們將透過計算
bw
前景的“受影響區域的骨架”(SKIZ)來“縮小”背景。可以透過計算
bw
距離變換的分水嶺變換,然後尋找結果的分水嶺脊線(
DL == 0
)來完成。
D
=
bwdist
(
bw
);
DL
=
watershed
(
D
);
bgm
=
DL
==
0
;
imshow
(
bgm
)
title
(
‘Watershed Ridge Lines’
)
步驟5:計算分割函式的分水嶺變換
函式
imimposemin
可用於修改影象,使其僅在某些所需位置具有區域最小值。在這裡,您可以用
imimposemin
來修改梯度幅度影象,以使其唯一的區域最小值出現在前景和背景標記畫素上。
gmag2
=
imimposemin
(
gmag
,
bgm
|
fgm4
);
最後,計算基於分水嶺的分割。
L
=
watershed
(
gmag2
);
步驟6:視覺化結果
一種視覺化技術是在原始影象上疊加前景標記、背景標記和分割物體的邊界。您可以根據需要使用膨脹來使某些方面(例如物件邊界)更加可見。物體邊界位於
L == 0
處。二進位制前景和背景標記縮放到不同的整數值,以便為它們分配不同的標籤。
labels
=
imdilate
(
L
==
0
,
ones
(
3
,
3
))
+
2
*
bgm
+
3
*
fgm4
;
I4
=
labeloverlay
(
I
,
labels
);
imshow
(
I4
)
title
(
‘Markers and Object Boundaries Superimposed on Original Image’
)
該視覺化說明了前景標記和背景標記的位置如何影響結果。在幾個位置中,部分被遮擋的較暗物件與它們的明亮鄰居物體合併,因為被遮擋的物體沒有前景標記。
另一種有用的視覺化技術是將標籤矩陣顯示為彩色影象。標籤矩陣(例如由
watershed
和
bwlabel
生成的標籤矩陣)可以使用
label2rgb
轉換為真彩色影象,以用於視覺化目的。
Lrgb
=
label2rgb
(
L
,
‘jet’
,
‘w’
,
‘shuffle’
);
imshow
(
Lrgb
)
title
(
‘Colored Watershed Label Matrix’
)
您可以使用透明度將此偽彩色標籤矩陣疊加在原始強度影象的頂部。
figure
imshow
(
I
)
hold
on
himage
=
imshow
(
Lrgb
);
himage
。
AlphaData
=
0。3
;
title
(
‘Colored Labels Superimposed Transparently on Original Image’
)
注:本文根據MATLAB官網內容修改而成。
以下的
免費影片教程
,特點是沒有PPT,不摻水,直接程式設計環境下的實操課程:
用100分鐘瞭解MATLAB程式設計
歡迎您進一步瞭解以下MATLAB系列文章: