C++ OpenCV基于距離變換與分水嶺的圖像分割
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
圖像分割
圖像分割,英文名image segmentation,就是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過(guò)程。它是由圖像處理到圖像分析的關(guān)鍵步驟。現(xiàn)有的圖像分割方法主要分以下幾類:
基于閾值的分割方法
基于區(qū)域的分割方法
基于邊緣的分割方法以及基于特定理論的分割方法
從數(shù)學(xué)角度來(lái)看,圖像分割是將數(shù)字圖像劃分成互不相交的區(qū)域的過(guò)程。圖像分割的過(guò)程也是一個(gè)標(biāo)記過(guò)程,即把屬于同一區(qū)域的像索賦予相同的編號(hào)。

圖像分割的目標(biāo)是將圖像中像素根據(jù)一定的規(guī)則分為若干個(gè)(N)個(gè)cluster集合,I每個(gè)集合包含一類像素。
根據(jù)算法分為監(jiān)督學(xué)習(xí)算法和無(wú)監(jiān)督學(xué)習(xí)算法,圖像分割的算法多數(shù)都是無(wú)監(jiān)督學(xué)習(xí)算法。---KMeans
距離變換與分水嶺介紹
距離變換

距離變換常見(jiàn)算法有兩種
不斷膨脹/ 腐蝕得到
基于倒角距離
分水嶺變換

分水嶺變換常見(jiàn)的算法
基于浸泡理論實(shí)現(xiàn)
相關(guān)API
cv::distanceTransform(
InputArray src,
OutputArray dst,
OutputArray labels,
int distanceType,
int maskSize,
int labelType = DIST_LABEL_CCOMP
)
distanceType = DIST_L1/DIST_L2,
maskSize = 3x3,最新的支持5x5,推薦3x3、
labels離散維諾圖輸出,
dst輸出8位或者32位的浮點(diǎn)數(shù),單一通道,大小與輸入圖像一致
cv::watershed(
InputArray image,
InputOutputArray markers
)
操作步驟
將白色背景變成黑色-目的是為后面的變換做準(zhǔn)備
使用filter2D與拉普拉斯算子實(shí)現(xiàn)圖像對(duì)比度提高,sharp
轉(zhuǎn)為二值圖像通過(guò)threshold
距離變換
對(duì)距離變換結(jié)果進(jìn)行歸一化到[0~1]之間
使用閾值,再次二值化,得到標(biāo)記
腐蝕得到每個(gè)Peak - erode
發(fā)現(xiàn)輪廓 – findContours
繪制輪廓- drawContours
分水嶺變換 watershed
對(duì)每個(gè)分割區(qū)域著色輸出結(jié)果
代碼演示
新建一個(gè)項(xiàng)目opencv-0027,配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法
這次我們用opencv里面自帶的一張圖像來(lái)實(shí)個(gè)這個(gè)方法

運(yùn)行顯示的圖像為

1.將白色背景變成黑色

我們運(yùn)行看一下

可以看到右邊的已經(jīng)把背景都換為黑色了。
2.使用filter2D與拉普拉斯算子實(shí)現(xiàn)圖像對(duì)比度提高,sharp

我們?cè)龠\(yùn)行看一下,左邊的就是生成的結(jié)果圖,可以看出左邊的清晰度更高了一些

3.轉(zhuǎn)為二值圖像通過(guò)threshold

我們?cè)龠\(yùn)行看一下,左邊的圖像已經(jīng)讓我們轉(zhuǎn)換為二值圖像了,也比較清晰

4.距離變換
5.對(duì)距離變換結(jié)果進(jìn)行歸一化到[0~1]之間
因?yàn)榫嚯x變換看不出任何效果,所以我們把4和5兩步放在一起顯示

我們?cè)龠\(yùn)行一下看看執(zhí)行結(jié)果

6.使用閾值,再次二值化,得到標(biāo)記

顯示效果為

7.腐蝕得到每個(gè)Peak
效果不太好看,我們需要再進(jìn)行二值的腐蝕,把上面的代碼再修改一下

我們?cè)倏匆幌逻\(yùn)行效果,可以看出來(lái)比剛才的效果好很多了

8.標(biāo)記并且開(kāi)始查找輪廓

這一步只是查找輪廓,我們接下來(lái)繪制查找的輪廓再一起顯示出來(lái)
9.繪制輪廓

上面drawContours和circle最后一個(gè)參數(shù)都是用了-1,代表著畫的輪廓里面進(jìn)行顏色填充
我們?cè)亠@示一下看看效果

看到好像什么也沒(méi)有,這是因?yàn)槲覀儺嫷妮喞×耍?我們改一下顯示效果

把最后顯示cv::imshow(imgdst,makers*5000)再乘5000,重新看一下顯示效果

這會(huì)兒就可以看到繪制的輪廓出來(lái)了
10.分水嶺變換

我們看看顯示的效果

可以看出,每個(gè)輪廓都有明顯的區(qū)分開(kāi)了。
11.對(duì)每個(gè)分割區(qū)域著色輸出結(jié)果


然后我們?cè)龠\(yùn)行看到最后結(jié)果

下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。
下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。
下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


