watershed就是傳說中的分水嶺演算法, 它將一幅影象看成是一塊有湖泊和山川組成的地形。 影象灰度值大的畫素對應海拔高的山地, 灰度值低的畫素對應於海拔低的盆地。watershed分割是模擬湖水**並在湖泊相遇處築壩的過程。一般水是從湖泊的最低處灌進去,最低點對應於影象的區域性最低點。 但確定區域性最低點的自動話演算法得到的結果往往不盡如人意, 所以常常要手動指定marker點。
函式原型
void cvwatershed(iplimage *src_image, cvarr* markers)
#include#include #include#include#include #include iplimage* marker_mask = 0;
iplimage* markers = 0;
iplimage* img0 = 0, *img = 0, *img_gray = 0, *wshed = 0;
cvpoint prev_pt = ;
void on_mouse(int event, int x, int y, int flags, void* param)
}int main()
if(c == 'w')
// 上面這些最後得到markers 將會是一些數值塊,每個輪廓區域內都有同一畫素值
// 到此時watershed 終於得到了它如飢似渴的 markers 這個markers 中記錄了剛剛
// 使用者用滑鼠勾勒的感興趣區域
cvmat* color_tab;
color_tab = cvcreatemat(1, comp_count, cv_8uc3);
// 構造乙個一維8bit無符號3通道元素型別的矩陣,用來記錄一些隨機的顏色
for(int i = 0; i < comp_count; i++)
// paint the watershed image
for(int i = 0; i < markers->height; i++)
for(int j = 0; j < markers->width; j++)
}cvaddweighted( wshed, 0.5, img_gray, 0.5, 0, wshed );
// 可以注釋掉看下效果
cvshowimage( "watershed transform", wshed );
cvreleasememstorage( &storage );
cvreleasemat( &color_tab );}}
return 1;
}
下面的**通過互動式的方式演示了watershed的過程,先在影象的不同區域畫線,然後按w鍵執行演算法。 下圖左邊是原圖和指定的markers, 右邊是分割的mask影象。 opencv 分水嶺演算法
分水嶺演算法是一種簡單的影象分割演算法,具體是人為規定兩點 以兩點為例 然後把這兩點看做低谷,向裡面注水,不停地蔓延,直到兩點形成的湖交界。opencv自帶了這個程式。摘抄如下,其中我做了一些修改。本程式的目的是測試分水嶺演算法 include include include include usi...
opencv實現分水嶺演算法
分水嶺演算法原理 iplimage marker mask 0 iplimage markers 0 iplimage img0 0,img 0,img gray 0,wshed 0 iplimage img gray 0,wshed 0 cvpoint prev pt void on mouse ...
OpenCV的分水嶺演算法
本文使用python實現 import cv2 as cv import numpy as np def watershed demo src print src.shape blurred cv.pyrmeanshiftfiltering src,10,100 去雜訊 gray cv.cvtcol...