第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在OpenCV中定義分水嶺的標(biāo)記?

如何在OpenCV中定義分水嶺的標(biāo)記?

qq_遁去的一_1 2019-12-10 09:08:24
我正在使用OpenCV為Android編寫。我正在使用標(biāo)記控制的分水嶺來分割類似于下面的圖像,而無需用戶手動(dòng)標(biāo)記圖像。我打算使用區(qū)域最大值作為標(biāo)記。minMaxLoc()會(huì)給我?guī)韮r(jià)值,但是如何將其限制在我感興趣的斑點(diǎn)上?我可以利用來自findContours()或cvBlob Blob 的結(jié)果來限制ROI并將最大值應(yīng)用于每個(gè)Blob嗎?
查看完整描述

3 回答

?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊

首先:該函數(shù)minMaxLoc僅查找給定輸入的全局最小值和全局最大值,因此對(duì)于確定區(qū)域最小值和/或區(qū)域最大值而言,它幾乎沒有用。但是您的想法是正確的,完全基于區(qū)域最小值/最大值提取標(biāo)記以執(zhí)行基于標(biāo)記的分水嶺變換。讓我嘗試闡明什么是分水嶺變換,以及如何正確使用OpenCV中存在的實(shí)現(xiàn)。

一些處理分水嶺的論文對(duì)其描述與隨后的描述類似(如果不確定,我可能會(huì)漏掉一些細(xì)節(jié):詢問)??紤]一下您所知道的某個(gè)區(qū)域的表面,其中包含山谷和山峰(在這里,與我們無關(guān)的其他細(xì)節(jié))。假設(shè)在此表面之下僅是水,有色水。現(xiàn)在,在表面的每個(gè)谷上打孔,然后水開始充滿整個(gè)區(qū)域。在某個(gè)時(shí)候,會(huì)遇到不同顏色的水,當(dāng)這種情況發(fā)生時(shí),您要建造一個(gè)大壩,使它們彼此不接觸。最后,您將獲得水壩的集合,這是分隔所有不同顏色的水的分水嶺。

現(xiàn)在,如果您在該表面上鉆孔太多,則最終會(huì)出現(xiàn)太多區(qū)域:過度分割。如果您做得太少,您將獲得細(xì)分市場。因此,幾乎所有建議使用分水嶺的論文實(shí)際上都提出了避免這些問題的技術(shù),以解決論文正在處理的應(yīng)用程序。

我寫了所有這些內(nèi)容(對(duì)于任何了解分水嶺變換的人來說都太幼稚了),因?yàn)樗苯臃从沉四鷳?yīng)該如何使用分水嶺實(shí)現(xiàn)(當(dāng)前公認(rèn)的答案是完全錯(cuò)誤的方式)。現(xiàn)在讓我們使用Python綁定從OpenCV示例開始。

問題中顯示的圖像由許多物體組成,這些物體太近且在某些情況下重疊。分水嶺在這里的用途是正確地將這些對(duì)象分開,而不是將它們分組為單個(gè)組件。因此,每個(gè)對(duì)象至少需要一個(gè)標(biāo)記,背景至少需要一個(gè)良好的標(biāo)記。例如,首先通過Otsu對(duì)輸入圖像進(jìn)行二值化,然后執(zhí)行形態(tài)學(xué)打開操作以去除小物體。該步驟的結(jié)果如下左圖所示?,F(xiàn)在,對(duì)于二進(jìn)制圖像,請(qǐng)考慮對(duì)其應(yīng)用距離變換,結(jié)果如右圖所示。

http://img1.sycdn.imooc.com//5db01699000144de02560192.jpghttp://img1.sycdn.imooc.com//5db0169a0001973d02560192.jpg根據(jù)距離變換結(jié)果,我們可以考慮一些閾值,以便僅考慮距背景最遠(yuǎn)的區(qū)域(下圖為左圖)。這樣做,通過在較早的閾值之后標(biāo)記不同的區(qū)域,我們可以獲得每個(gè)對(duì)象的標(biāo)記。現(xiàn)在,我們還可以考慮將左側(cè)圖片的放大版本的邊框組成標(biāo)記。完整的標(biāo)記顯示在右側(cè)的下方(某些標(biāo)記太暗而看不見,但左側(cè)圖像中的每個(gè)白色區(qū)域均在右側(cè)圖像中表示)。

http://img1.sycdn.imooc.com//5db016a600015f2102560192.jpghttp://img1.sycdn.imooc.com//5db016a7000164ab02560192.jpg

我們?cè)谶@里使用的這個(gè)標(biāo)記很有意義。每個(gè)colored water == one marker將開始填充該區(qū)域,并且分水嶺轉(zhuǎn)換將建造水壩,以阻止不同的“顏色”合并。如果進(jìn)行變換,則圖像在左側(cè)。通過將水壩與原始圖像進(jìn)行組合而僅考慮水壩,我們得到的結(jié)果是正確的。

http://img1.sycdn.imooc.com//5db016b00001632602560192.jpghttp://img1.sycdn.imooc.com//5db016b100011fb802560192.jpg

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)



查看完整回答
反對(duì) 回復(fù) 2019-12-11
  • 3 回答
  • 0 關(guān)注
  • 417 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)