OpenCV學習 8 分水嶺演算法 2

2021-09-06 11:55:51 字數 2199 閱讀 7358

現在我們看看opencv中如何使用分水嶺演算法。

首先我們開啟一副影象:

// 開啟另一幅影象

接下來,我們要建立mark影象。mark影象格式是有符號整數,其中沒有被mark的部分用0表示,其它不同區域的mark標記,我們用非零值表示,通常為1-255,但也可以為其它值,比如大於255的值,不同mark區域甚至可以用同樣的值,這個值大小對最後分割可能沒有影響(也可能影響),最好不同mark區域還是用不同的值表示,這樣能夠確保結果正確,

之所以用有符號整數,是因為opencv在分水嶺演算法內部,要用-1,-2等來標記注水區域,

最終在mark影象中生成的分水嶺線就是用-1表示。

我們通常會建立uchar格式的灰度圖,指定mark區域,然後轉化為有符號整數的影象格式。

首先對整個背景區域我們建立乙個mark域,是下圖中白色框框住的部分,其灰度值為255,第二個選擇mark域為塔,就是黑色框框住的一塊區域,其灰度值為64,最後就是樹mark域,藍色框的部分,其灰度值為128。在分水嶺演算法時候,會分別對這個3個區域來進行注水操作,如果兩個注水盆地被乙個mark域覆蓋,則它們之間不會有分水嶺線產生。

對於mark影象,opencv分水嶺演算法在初始化時候,會把最外圈的值置為-1,作為整個影象的邊界,所以我們第乙個mark區域,選擇倒數第2外圈,因為設定到最外圈,最後還是會被沖掉。

// 標示背景影象

cv::mat imagemask(image.size(),cv_8u,cv::scalar(0));

cv::rectangle(imagemask,cv::point(1,1),cv::point(image.cols-2,image.rows-2),cv::scalar(255),1);

// 表示塔

cv::rectangle(imagemask,cv::point(image.cols/2-10,image.rows/2-10),

cv::point(image.cols/2+10,image.rows/2+10),cv::scalar(64),10);

//樹cv::rectangle(imagemask,cv::point(64,284),

cv::point(68,300),cv::scalar(128),5);

mark影象:

注意:mark影象是32bit的有符號整數,所以在使用分水嶺演算法前,我們先對mark影象做乙個轉化。演算法執行完後,再轉化為0-255的灰度圖。

imagemask.convertto(imagemask,cv_32s);

// 設定marker和處理影象

cv::watershed(image,imagemask);

cv::mat mark1;

imagemask.convertto(mark1,cv_8u);

cv::namedwindow("marker");

cv::imshow("marker",mark1);

此時imagemask影象從無符號整數轉化為uchar後,如下圖所示,第乙個mask區域注水,將會使得整個影象為白色,之後分別在第二個,第三個區域的盆地注水,會產生相應的注水圖,注水的區域的值即為mark的值,128和64, 分水嶺線則為0,注:在轉化前分水嶺線的值為-1,轉化後成為0。

我們使用乙個轉化函式把分水嶺線轉化為黑色,其它的部分都白黑色,轉化函式的公式為:

imagemask(x,y) = saturate_cast(255*imagemask(x,y)+255)

imagemask.convertto(imagemask,cv_8u,255, 255);

最後顯示分水嶺線,得到下圖:(注:在轉化前,分水嶺線的值為-1)

原始碼:工程firstopencv7

OpenCV學習 9 分水嶺演算法 3

本教程我學習一下opencv中分水嶺演算法的具體實現方式。原始影象和mark影象,它們的大小都是32 32,分水嶺演算法的結果是得到兩個連通域的輪廓圖。原始影象 原始影象必須是3通道影象 mark影象 結果影象 初始的mark影象資料如下,黃色的部分為我們的第乙個mark區域,值為255,第二個區域...

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