0042-在OpenCV下利用均值漂移(Meanshift)進行影象分割
均值漂移實現影象分割的大概原理請見網頁http://www.docin.com/p-631981950.html,網頁中對原理的理解已經說得比較清楚。如果你想了解詳細原理,可以參考PAMI 2003的一篇文章,非常經典的哦,文章名稱是 Mean Shift:A Robust Approach Toward Feature Space Analysis。
演算法具點過程:
如下圖所示:原點是選定的初始迭代點,將藍色圓(其半徑記為h)內所有向量相加,相加的結果如黃色向量所示,其終點指向上圖所示的紅色點,則下一次迭代以該紅色點為圓心,h為半徑畫圓,然後求這個圓內以圓心為起點所有向量的和。如此迭代下去,圓的中心點為收斂於一個固定的點,也就是概率密度最大的地方。接著,在實現影象分割時,將收斂於同一極大值的所有點歸為一類,將符合引數條件的類合併就得到影象分割的結果。Meanshift演算法就是用於這個特點,體現了很好的邊界識別特性。
OpenCV中提供了函式pyrMeanShiftFiltering()來實現色彩聚類平滑濾波,進而間接實現影象分割,其利用的原理正是均值漂移原理。注意,這個函式嚴格來說並不是進行影象的分割,而是影象在色彩層面的平滑濾波,它可以中和色彩分佈相近的顏色,平滑色彩細節,侵蝕掉面積較小的顏色區域,所以在Opencv中它的字尾是濾波“Filter”,而不是分割“segment”。
函式原型如下:
C++: void pyrMeanShiftFiltering(InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) )
引數意義如下:
src:源影象
dst:輸出影象
sp:空間視窗半徑
sr:顏色視窗半徑
maxLevel:高斯金字塔最高層數
termcrit:-均值漂移引數的終止條件
程式碼如下:
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼中使用了floodFill函式進行影象分割的泛洪填充,這個函式的使用見下面這篇文章https://blog.csdn.net/opencv_source/article/details/83752957
程式碼執行結果如下圖所示: