[Medical Image Process] 3.4 Morphology Application—Watershed Algorithm 分水岭算法
1. 分水嶺原理
分水嶺算法是一種基于拓撲理論的數學形態學分割理論,其基本思想是把圖像看作是測地學上的拓撲地貌,圖像中每一點像素的灰度值表示該點的海拔高度,每一個局部極小值及其影響區域成為集水盆,而集水盆的邊界則形成分水嶺。分水嶺的概念和形成可以通過模擬浸入過程來說明。在每一個局部極小值表面,刺穿一個小孔,然后把整個模型慢慢浸入水中,隨著浸入的加深,每一個局部極小值的影響域慢慢向外擴展,在兩個集水盆匯合處構筑大壩,即形成分水嶺。分水嶺的計算過程是一個迭代標注過程。
分水嶺比較經典的計算方法是L.Vincent提出的。在該算法中,分水嶺計算分兩個步驟,一個是排序過程,一個是淹沒過程。首先對每個像素的灰度級進行從低到高的排序,然后再從低到高實現淹沒過程中,對每一個局部極小值在H階高度的影響域采用先進先出(FIFO)結構進行判斷及標注。
分水嶺變換得到的是輸入圖像的集水盆圖像,集水盆之間的分界點即為分水嶺。顯然分水嶺表示的是輸入圖像極大值點。因此為了得到圖像的邊緣信息,通常把梯度圖像作為輸入圖像,即g(x,y)=grad(f(x,y))=sqrt{[f(x,y)-f(x-1,y)]^2 + [f(x.y)-f(x,y-1)]^2}。
分水嶺算法對微弱的邊緣具有良好的響應,是得到封閉連續邊緣的保證。另外,分水嶺算法所得到的封閉的集水盆,為分析圖像的區域特征提供了可能。
實際應用過程中,由于一幅圖像存在非常多極小值,就會造成圖像的過分割。通常可以采用兩種方法加以解決,一是利用先驗知識去除無關邊緣信息。二是修改梯度函數,使得集水盆只響應想要探測的目標。為了降低分水嶺算法產生的過度分割,通常要對梯度函數進行修改,一個最簡單的方法就是對梯度圖像進行閾值處理,用以消除灰度的微小變化產生的過度分割。即g(x,y)=max(grad(f(x,y)),gΘ),式中gΘ表示閾值。程序可采用的方法:用閾值限制梯度圖像已達到消除灰度值的微小變化造成的過分割結果,獲得適量分割區域,在對這些區域的邊緣點的灰度級進行從高到低的排序,然后再從低到高實現淹沒過程。梯度圖像用Sobel算子計算獲得。對梯度圖像進行閾值處理時,選取合適的閾值對最終分割的圖像有很大影響,因此閾值的選取是圖像分割效果好壞的一個關鍵。缺點:實際圖像中可能含有微弱的邊緣,灰度變化的數值差別不是特別明顯,選取閾值過大可能會消去這些微弱邊緣。
2. Matlab仿真分析分水嶺算法
2.1 算法綜述
如果圖像中的目標物體是連接在一起的,則分割起來會更困難,分水嶺算法通常用于處理這一類問題,通常也會取得非常不錯的結果。分水嶺分割算法把圖像看成一幅“地形圖”,其中亮度比較強的區域像素值比較大,而比較暗的區域像素值比較小,通過尋找“匯水盆地”和“分水嶺”界限,對圖像進行分割。(Separating touching objects in an image is one of the most difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins " and " watershed rigid lines" in an image by treating is as a surface where light pixels are high and dark pixels are low.) 就像上面所說一樣,直接應用分水嶺分割算法的效果往往是不好的,如果在圖像中對前景對象和背景對象進行標注區別,再應用分水嶺算法會取得較好的分割效果。(Segmentation using the watershed transform works better if you can identify or "mark", foreground object and background object.)2.2 算法執行步驟
1.計算分割函數。圖像中較暗的區域是要分割的對象。 2.計算前景標志。這些是每個對象內部連接的斑點像素。 3.計算背景標志。這些不屬于任何對象的像素。 4.修改分割函數,使其僅在前景和背景標記位置有極小值。 5.對修改后的分割函數做分水嶺變換計算。2.3 matlab 仿真研究
2.3.1 讀入一幅彩色圖像,并轉成灰度圖。2.3.2 將圖像的梯度幅值作為分割函數 采用Sobel邊緣算子對圖像進行水平方向和豎直方向進行濾波,然后求取模值,作為圖像的邊緣梯度。這是因為Sobel算子濾波后,在圖像的邊界處將會出現較大值,在非邊界出現較小值。
(我們直接用梯度圖像做為“分水嶺”分割的導向函數,觀察效果)
這樣,我們可以看到。如果不對原始的邊緣梯度圖像進行處理,由于存在無數個極小值,這就勢必會導致算法發生過分割的現象。因此,實際操作過程中,應該分別對前景對象和北京對象進行標記,已獲得更好的分割結果。 2.3.3 標記前景對象 有多種方法可以應用在這里來獲得前景標記,這些標記必須是前景對象內部的連接斑點像素。我們可以使用形態學技術“基于開的重建”和“基于閉的重建”來清理圖像。這些操作將會在每個像素內部創建單位極大值,我們使用imregionalmax來定位。 開閉運算可以講圖像中壁結構元素小的特定圖像細節去除,同時保證不產生全局幾何失真。開運算可以把比結構單元小的突刺濾掉(比較亮的點),切斷細長搭接而起到分離作用;閉運算可以把比結構元素小的缺口或空填上,搭接短的間隔而起到連接作用。
圖像開操作
接下來,通過腐蝕后的重建來做基于開的重建計算。
在圖像開操作的基礎之上,進行圖像的閉操作,去除圖像中的暗點。
執行基于閉的形態學重建操作
通過上面的對比,我們可以清晰地看出,基于重建的開閉操作要比標準的開閉重建更加有效。那么就可以直接獲取局部極大值來進行前景標記。 我們可以注意到,大多數閉塞處和陰影對象沒有被標記,這就意味著這些對象在結果中將不會得到合理的分割。而且,一些對象的前景標記會一直到對象的邊緣。這就意味著應該清理標記斑點的邊緣,然后收縮他們。下面通過閉操作來清理標記斑點通過腐蝕操作來縮小區域。
這個過程中(腐蝕操作),會留下一些偏離的孤立元素,用bwareaopen移除少于特定像素個數的斑點。BW2 =?bwareaopen(BW,P)指的是從二值圖像中移除所有少于P像素的連通塊。
2.3.4 背景標記 現在我們需要對背景進行標記,在清理后的“基于重建的拍閉運算”圖像中,暗像素屬于背景,所以可以從閾值操作開始。
背景像素在黑素的區域,但是理想情況下,不必要求背景標記太接近于要分割的對象邊緣。通過計算“骨架影響范圍”來細化“背景”。這個可以通過計算BW的距離變換的分水嶺變換來實現,然后尋找結果的分水嶺脊線D=bwdist(BW)計算二值圖像BW的歐幾里得矩陣。對BW的每一個像素,距離變換指定像素和最近的BW非零像素之間的距離。bwdist默認使用歐幾里得距離公式。
2.3.5 梯度函數有限的分水嶺變換
源代碼: %Watershed clc; clear all; close all; ImgRgb = imread('apple.jpg'); if ndims(ImgRgb) == 3I = rgb2gray(ImgRgb); elseI = ImgRgb; end %Sobel 求圖像邊緣 hy = fspecial('sobel'); hx = hy'; Iy = imfilter(double(I), hy, 'replicate'); Ix = imfilter(double(I), hx, 'replicate'); GradMag = sqrt(Ix.^2 + Iy.^2); %直接利用梯度函數圖像分割 L = watershed(GradMag); %基于開運算的重建 se = strel('disk', 20); ImgOpen = imopen(I, se); ImgErode = imerode(I, se); ImgErodeConstrnct = imreconstruct(ImgErode, I); %基于閉操作的圖像重建 Ioc = imclose(ImgOpen, se); ImgErodeConstrnctDilate = imdilate(ImgErodeConstrnct, se); ImgErodeConstrnctDilateConstruct = imreconstruct(imcomplement(ImgErodeConstrnctDilate), imcomplement(ImgErodeConstrnct)); ImgErodeConstrnctDilateConstruct = imcomplement(ImgErodeConstrnctDilateConstruct); %標記前景的極大值 fgm = imregionalmax(ImgErodeConstrnctDilateConstruct); %去除前景中的零散點,并進行區域收縮 se2 = strel(ones(5,5)); fgm2 = imclose(fgm, se2); fgm3 = imerode(fgm2, se2); %進一步去除小的連通域 fgm4 = bwareaopen(fgm3, 20); %標記背景 bw = im2bw(ImgErodeConstrnctDilateConstruct, graythresh(ImgErodeConstrnctDilateConstruct)); %脊線分割 D = bwdist(bw); DL = watershed(D); bgm = DL == 0; gradmag2 = imimposemin(GradMag, bgm | fgm4); L = watershed(gradmag2); It1 = ImgRgb(:, :, 1); It2 = ImgRgb(:, :, 2); It3 = ImgRgb(:, :, 3); fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4; It1(fgm5) = 0; It2(fgm5) = 255; It3(fgm5) = 0; I4 = cat(3, It1, It2, It3); Lrgb = label2rgb(L, 'jet', 'w', 'shuffle'); figure('units', 'normalized', 'position', [0 0 1 1]); subplot(1, 2, 1); imshow(ImgRgb, []); title('原圖像'); subplot(1, 2, 2); imshow(I4, []); title('標記和對象邊緣疊加到原圖像');
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的[Medical Image Process] 3.4 Morphology Application—Watershed Algorithm 分水岭算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞秋未来的发展趋势
- 下一篇: 图像及其表达与性质(上)