您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關C++ OpenCV圖像分割之如何實現分水嶺分割的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
API介紹
void watershed( InputArray image, InputOutputArray markers );
參數說明:
image: 必須是一個8bit 3通道彩色圖像矩陣序列
markers: 在執行分水嶺函數watershed之前,必須對第二個參數markers進行處理,它應該包含不同區域的輪廓,每個輪廓有一個自己唯一的編號,輪廓的定位可以通過Opencv中findContours方法實現,這個是執行分水嶺之前的要求。算法會根據markers傳入的輪廓作為種子(也就是所謂的注水點),對圖像上其他的像素點根據分水嶺算法規則進行判斷,并對每個像素點的區域歸屬進行劃定,直到處理完圖像上所有像素點。而區域與區域之間的分界處的值被置為“-1”,以做區分。
上面的API函數非常簡單,但是參數里面第二個說了在需要進行輪廓的提取,所以說在做分水嶺操作之前,我們要結合以前學過的知識對圖像進行先一步的處理如 均值濾波----變成灰度圖---二值化---形態學操作---查找輪廓等
代碼演示
我們再新建一個項目名為opencv--Matting,按照配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法.
運行一下看我們的源圖
上面就是我們的源圖,然后我們開始進行圖像分割
1.均值漂移算法
我們看一下結果,右圖上變化不大,就是相當于做了一個簡單的模糊
2.把圖像轉為灰度圖并進行二值化操作
再運行看一下效果
3.圖二值化圖像進行距離變化并歸一化顯示出來
運行效果
4.將變換后的重新二值化顯示出來
運行效果
5.定義markers并劃到新的Mat里面
6.對源圖進行形態學操作,去掉干擾,讓效果更好
7.將生成的markers進行分水嶺轉換
8.生成隨機顏色,并填充顏色,在新的圖像中畫出來后看一下分割的效果
9.顯示最后填充的圖片并打印出一共多少個
我們來看一下運行效果
可以看到上面已經把所有的顏色都區分開了,我們再看一下輸入的輪廓數,下面打印出來的就是14個,也和我們圖片中是一樣的。
感謝各位的閱讀!關于“C++ OpenCV圖像分割之如何實現分水嶺分割”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。