matlab图像处理——分水岭法
分水嶺算法(watershed)是一種借鑒了形態學理論的分割方法,在該方法中,將一幅圖像看成一個拓撲地形圖,其中灰度值f(x,y)對應地形高度值。高灰度值對應的山峰,低灰度值對應山谷。水總是朝地勢低的地方流動,直到某一局部低洼處才停下來,這個低洼處被稱為吸水盆地。最終所有的水分會分聚在不同的吸水盆地,吸水盆地之間的山脊被稱為分水嶺。水從分水嶺留下時,朝不同的吸水盆地流動的可能性是相等的。使用這種想法用于圖像分割,就是要在灰度圖像中找出不同的“吸水盆地”和“分水嶺”。
分水嶺閾值選擇算法可以看作一種自適應的多閾值分割算法,在圖像梯度圖上進行閾值選擇時,經常遇到的問題是如何恰當的選擇閾值。若閾值選得太高,則許多邊緣會丟失或出現破碎現象;若閾值選得太低,則容易產生虛假邊緣,而且邊緣變厚導致定位不精確。分水嶺法可以避免這個問題。
matlab中提供的watershed函數用于實現分水嶺分割圖像,其調用格式如下。
L=watershed(A):輸入參數A為待分割的圖像;輸出參數L為與A維數相同的非負整數矩陣,標記分割結果。矩陣元素值為對應位置上像素點所屬區域編號,0元素表示對該像素點是分水嶺像素,不屬于任何一個區域。
L=watershed(A,conn):參數conn用于指定算法中使用的元素的連通方式。(二維連通:conn取 4或8;三維conn可取4、8或16)
watershed函數不僅適用于圖像分割,也可以用于對任意維區域進行分割,A是對這個區域的描述,可以是任意維的數組,每一個元素可以是任意實數。
clear all %產生一個包含兩個重疊的圓形圖案的二值圖像 center1 = -10; center2 = -center1; dist = sqrt(2*(2*center1)^2);radius = dist/2 * 1.4; lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)]; [x,y]=meshgrid(lims(1):lims(2)); bw1 = sqrt((x-center1).^2+(y-center1).^2) <=radius; bw2 = sqrt((x-center2).^2+(y-center2).^2) <=radius; bw = bw1 | bw2; subplot(131);imshow(bw,'InitialMagnification','fit');xlabel('(a)二值圖像'); %對二值圖像進行變換,得到一個包含兩個“盆地”的圖像 D=bwdist(~bw); subplot(132);imshow(D,[],'InitialMagnification','fit'); xlabel('(b)分割前的等高線'); %補充距離變換 D=-D; D(~bw) =-Inf; %進行watershed分割并將分割結果以標記圖形式繪出 L=watershed(D); rgb = label2rgb(L,'jet',[.5 .5 .5]); subplot(133);imshow(rgb,'InitialMagnification','fit'); xlabel('(c)D的分水嶺變換')結果圖如下:
三維不作解釋,差不多道理。還請多多指教。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的matlab图像处理——分水岭法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监督学习 | 集成学习 之AdaBoos
- 下一篇: MapReduce_自学过程(一)