OpenCV之分水嶺演算法

2021-10-25 12:44:42 字數 2001 閱讀 1874

在許多實際的應用中,我們需要分割影象,但是無法從背景影象中獲得有用資訊。但是分水嶺演算法在這方面往往非常有效,它可以將影象中的邊緣轉化為「山脈」,將均勻區域轉化為「山谷」,這樣有助於分割目標。

分水嶺演算法是一種記憶拓撲理論的數學形態學的分割方法,其基本思想是把影象看作測地學上的拓撲地貌,影象中每點畫素的灰度值表示該點的海拔高度,每乙個區域性極小值及其影響區域稱為集水盆,而集水盆的邊界則形成分水嶺。

分水嶺的計算過程是乙個迭代標註過程。分水嶺比較經典的計算方法主要分兩個步驟:乙個是排序過程,乙個是淹沒過程首先對每個畫素的灰度級進行從低到高的排序,然後在從低到高實現淹沒的過程中,對每個區域性極小值在h階高度的影響域採用先進先出(fifo)結構進行判斷及標註。分水嶺變化得到的是輸入影象的集水盆影象,集水盆之間的邊界點,即分水嶺。顯然,分水嶺表示的是輸入影象的極大值點。

也就是說,分水嶺演算法首先計算灰度影象的梯度;這對影象中的「山谷」或沒有紋理的「盆地」(亮度值低的點)的形成是很有效的,也對「山頭」或影象中有主導線段的「山脈」的形成有效。然後開始從使用者指定的點(或者演算法得到的點)開始持續「灌注」盆地直到這些區域連成一片。基於這樣產生的標記可以把區域合併到一起,合併後的區域通過聚集的方式進行分割。

函式watershed實現的分水嶺演算法是基於標記的分割演算法的一種。在把影象傳給函式之前,我們需要大致的勾畫出影象中期望分割的區域,它們被標記為正指數。所以,每乙個區域都會被標記為畫素值1、2、3等,表示成為乙個或多個連線元件。這些標記的值可以使用findcontours()函式和drawcontours()函式由二進位制的掩碼檢索出來。其實這些標記就是即將繪製出來的分割區域的「種子點」,而沒有標記清楚的區域,被置為0。在函式的輸出中,每乙個標記中的畫素被設為種子的值,而區域間的值被設為-1.

分水嶺演算法是一種影象區域分割法,在分割的過程中,它會把跟臨近畫素間的相似性作為重要的參考依據,從而將在空間位置上相近並且灰度值相近的畫素點互相連線起來構成乙個封閉的輪廓,封閉性是分水嶺演算法的乙個重要特徵。

函式原型:

void watershed(inpurarray image, inputoutputarray markers)
引數詳解:

**示例:

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