opencv中分水嶺演算法 cvWatershed

2021-06-22 04:43:16 字數 1382 閱讀 8870

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...