3 回答

TA貢獻1845條經驗 獲得超8個贊
首先:該函數minMaxLoc
僅查找給定輸入的全局最小值和全局最大值,因此對于確定區域最小值和/或區域最大值而言,它幾乎沒有用。但是您的想法是正確的,完全基于區域最小值/最大值提取標記以執行基于標記的分水嶺變換。讓我嘗試闡明什么是分水嶺變換,以及如何正確使用OpenCV中存在的實現。
一些處理分水嶺的論文對其描述與隨后的描述類似(如果不確定,我可能會漏掉一些細節:詢問)??紤]一下您所知道的某個區域的表面,其中包含山谷和山峰(在這里,與我們無關的其他細節)。假設在此表面之下僅是水,有色水?,F在,在表面的每個谷上打孔,然后水開始充滿整個區域。在某個時候,會遇到不同顏色的水,當這種情況發生時,您要建造一個大壩,使它們彼此不接觸。最后,您將獲得水壩的集合,這是分隔所有不同顏色的水的分水嶺。
現在,如果您在該表面上鉆孔太多,則最終會出現太多區域:過度分割。如果您做得太少,您將獲得細分市場。因此,幾乎所有建議使用分水嶺的論文實際上都提出了避免這些問題的技術,以解決論文正在處理的應用程序。
我寫了所有這些內容(對于任何了解分水嶺變換的人來說都太幼稚了),因為它直接反映了您應該如何使用分水嶺實現(當前公認的答案是完全錯誤的方式)?,F在讓我們使用Python綁定從OpenCV示例開始。
問題中顯示的圖像由許多物體組成,這些物體太近且在某些情況下重疊。分水嶺在這里的用途是正確地將這些對象分開,而不是將它們分組為單個組件。因此,每個對象至少需要一個標記,背景至少需要一個良好的標記。例如,首先通過Otsu對輸入圖像進行二值化,然后執行形態學打開操作以去除小物體。該步驟的結果如下左圖所示。現在,對于二進制圖像,請考慮對其應用距離變換,結果如右圖所示。
根據距離變換結果,我們可以考慮一些閾值,以便僅考慮距背景最遠的區域(下圖為左圖)。這樣做,通過在較早的閾值之后標記不同的區域,我們可以獲得每個對象的標記?,F在,我們還可以考慮將左側圖片的放大版本的邊框組成標記。完整的標記顯示在右側的下方(某些標記太暗而看不見,但左側圖像中的每個白色區域均在右側圖像中表示)。
我們在這里使用的這個標記很有意義。每個colored water == one marker
將開始填充該區域,并且分水嶺轉換將建造水壩,以阻止不同的“顏色”合并。如果進行變換,則圖像在左側。通過將水壩與原始圖像進行組合而僅考慮水壩,我們得到的結果是正確的。
import sys
import cv2
import numpy
from scipy.ndimage import label
def segment_on_dt(a, img):
border = cv2.dilate(img, None, iterations=5)
border = border - cv2.erode(border, None)
dt = cv2.distanceTransform(img, 2, 3)
dt = ((dt - dt.min()) / (dt.max() - dt.min()) * 255).astype(numpy.uint8)
_, dt = cv2.threshold(dt, 180, 255, cv2.THRESH_BINARY)
lbl, ncc = label(dt)
lbl = lbl * (255 / (ncc + 1))
# Completing the markers now.
lbl[border == 255] = 255
lbl = lbl.astype(numpy.int32)
cv2.watershed(a, lbl)
lbl[lbl == -1] = 0
lbl = lbl.astype(numpy.uint8)
return 255 - lbl
img = cv2.imread(sys.argv[1])
# Pre-processing.
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, img_bin = cv2.threshold(img_gray, 0, 255,
cv2.THRESH_OTSU)
img_bin = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN,
numpy.ones((3, 3), dtype=int))
result = segment_on_dt(img, img_bin)
cv2.imwrite(sys.argv[2], result)
result[result != 255] = 0
result = cv2.dilate(result, None)
img[result == 255] = (0, 0, 255)
cv2.imwrite(sys.argv[3], img)
- 3 回答
- 0 關注
- 1459 瀏覽
添加回答
舉報