這篇文章主要為大家展示了“C++ OpenCV如何實現(xiàn)基于距離變換與分水嶺的圖像分割”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++ OpenCV如何實現(xiàn)基于距離變換與分水嶺的圖像分割”這篇文章吧。
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鎮(zhèn)巴免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
圖像分割
圖像分割,英文名image segmentation,就是把圖像分成若干個特定的、具有獨特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過程。它是由圖像處理到圖像分析的關(guān)鍵步驟?,F(xiàn)有的圖像分割方法主要分以下幾類:
基于閾值的分割方法
基于區(qū)域的分割方法
基于邊緣的分割方法以及基于特定理論的分割方法
從數(shù)學(xué)角度來看,圖像分割是將數(shù)字圖像劃分成互不相交的區(qū)域的過程。圖像分割的過程也是一個標(biāo)記過程,即把屬于同一區(qū)域的像索賦予相同的編號。
圖像分割的目標(biāo)是將圖像中像素根據(jù)一定的規(guī)則分為若干個(N)個cluster集合,I每個集合包含一類像素。
根據(jù)算法分為監(jiān)督學(xué)習(xí)算法和無監(jiān)督學(xué)習(xí)算法,圖像分割的算法多數(shù)都是無監(jiān)督學(xué)習(xí)算法。---KMeans
距離變換與分水嶺介紹
距離變換
距離變換常見算法有兩種
不斷膨脹/ 腐蝕得到
基于倒角距離
分水嶺變換
分水嶺變換常見的算法
基于浸泡理論實現(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位的浮點數(shù),單一通道,大小與輸入圖像一致
cv::watershed(
InputArray image,
InputOutputArray markers
)
操作步驟
將白色背景變成黑色-目的是為后面的變換做準(zhǔn)備
使用filter2D與拉普拉斯算子實現(xiàn)圖像對比度提高,sharp
轉(zhuǎn)為二值圖像通過threshold
距離變換
對距離變換結(jié)果進(jìn)行歸一化到[0~1]之間
使用閾值,再次二值化,得到標(biāo)記
腐蝕得到每個Peak - erode
發(fā)現(xiàn)輪廓 – findContours
繪制輪廓- drawContours
分水嶺變換 watershed
對每個分割區(qū)域著色輸出結(jié)果
代碼演示
新建一個項目opencv-0027,配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法
這次我們用opencv里面自帶的一張圖像來實個這個方法
運行顯示的圖像為
1.將白色背景變成黑色
我們運行看一下
可以看到右邊的已經(jīng)把背景都換為黑色了。
2.使用filter2D與拉普拉斯算子實現(xiàn)圖像對比度提高,sharp
我們再運行看一下,左邊的就是生成的結(jié)果圖,可以看出左邊的清晰度更高了一些
3.轉(zhuǎn)為二值圖像通過threshold
我們再運行看一下,左邊的圖像已經(jīng)讓我們轉(zhuǎn)換為二值圖像了,也比較清晰
4.距離變換
5.對距離變換結(jié)果進(jìn)行歸一化到[0~1]之間
因為距離變換看不出任何效果,所以我們把4和5兩步放在一起顯示
我們再運行一下看看執(zhí)行結(jié)果
6.使用閾值,再次二值化,得到標(biāo)記
顯示效果為
7.腐蝕得到每個Peak
效果不太好看,我們需要再進(jìn)行二值的腐蝕,把上面的代碼再修改一下
我們再看一下運行效果,可以看出來比剛才的效果好很多了
8.標(biāo)記并且開始查找輪廓
這一步只是查找輪廓,我們接下來繪制查找的輪廓再一起顯示出來
9.繪制輪廓
上面drawContours和circle最后一個參數(shù)都是用了-1,代表著畫的輪廓里面進(jìn)行顏色填充
我們再顯示一下看看效果
看到好像什么也沒有,這是因為我們畫的輪廓太小了, 我們改一下顯示效果
把最后顯示cv::imshow(imgdst,makers*5000)再乘5000,重新看一下顯示效果
這會兒就可以看到繪制的輪廓出來了
10.分水嶺變換
我們看看顯示的效果
可以看出,每個輪廓都有明顯的區(qū)分開了。
11.對每個分割區(qū)域著色輸出結(jié)果
然后我們再運行看到最后結(jié)果
以上是“C++ OpenCV如何實現(xiàn)基于距離變換與分水嶺的圖像分割”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!