1. 程式人生 > >MeanShift用於彩色影象分割(OpenCV)

MeanShift用於彩色影象分割(OpenCV)

一、均值偏移(Mean Shift)演算法

Mean Shift演算法,一般是指一個迭代的步驟,即先算出當前點的偏移均值,移動該點到其偏移均值,然後以此為新的起始點。繼續移動,直到滿足一定的條件結束。

Mean Shift向量定義:

上述定義的理解:在d維空間中,任選一個點,然後以這個點為圓心,h為半徑做一個高維球,因為有d維,d可能大於2,所以是高維球。落在這個球內的所有點和圓心都會產生一個向量(以圓心為起點落在球內的點為終點)。然後把這些向量都相加,其結果還是一個向量,即Meanshift向量。

如下左圖所示,黃色箭頭就是MeanShift向量。再以meanshift向量的終點為圓心,再做一個高維的球。如下中圖所示,重複以上步驟,又得到一個meanshift向量。如此重複下去,meanshift演算法可以收斂到概率密度最大得地方。也就是最稠密的地方,如下右圖所示。

二、MeanShift用於彩色影象分割

利用均值偏移演算法實現彩色影象分割,OpenCV中對應的函式是pyrMeanShiftFiltering。這個函式嚴格來說並不是影象的分割,而是影象在色彩層面的平滑濾波,它可以中和色彩分佈相近的顏色,平滑色彩細節,侵蝕掉面積較小的顏色區域,所以在Opencv中它的字尾是濾波“Filter”,而不是分割“segment”。  

pyrMeanShiftFiltering函式的執行過程是這樣的: 迭代空間構建:以輸入影象src上任一點P0為圓心,建立物理空間上半徑為sp,色彩空間上半徑為sr的球形空間,物理空間上座標2個x、y,色彩空間上座標3個R、G、B(或HSV),構成一個5維的空間球體。其中物理空間的範圍x和y是影象的長和寬,色彩空間的範圍R、G、B分別是0~255。 求取迭代空間的向量並移動迭代空間球體後重新計算向量,直至收斂。在1中構建的球形空間中,求得所有點相對於中心點的色彩向量之和後,移動迭代空間的中心點到該向量的終點,並再次計算該球形空間中所有點的向量之和,如此迭代,直到在最後一個空間球體中所求得的向量和的終點就是該空間球體的中心點Pn,迭代結束。 更新輸出影象dst上對應的初始原點P0的色彩值為本輪迭代的終點Pn的色彩值,如此完成一個點的色彩均值漂移。 對輸入影象src上其他點,依次執行步驟1,、2、3,遍歷完所有點位後,整個均值偏移色彩濾波完成,這裡忽略對金字塔的討論。 在這個過程中,關鍵引數是sp和sr的設定,二者設定的值越大,對影象色彩的平滑效果越明顯,同時函式耗時也越多。

到這裡,meanShift均值偏移演算法對彩色影象的平滑操作就完成了,為了達到分割的目的,需要藉助另外一個漫水填充函式的進一步處理來實現,那就是floodFill: ---------------------  作者:guoyunfei20  來源:CSDN  原文:https://blog.csdn.net/guoyunfei20/article/details/78729490  版權宣告:本文為博主原創文章,轉載請附上博文連結!

/********************************
src      輸入影象,8位,三通道的彩色影象,並不要求必須是RGB格式,HSV、YUV等OpenCV中的彩色影象格式均可;
dst      輸出影象,跟輸入src有同樣的大小和資料格式;
sp       定義的漂移物理空間半徑大小;
sr       定義的漂移色彩空間半徑大小;
maxLevel 定義金字塔的最大層數;
termcrit 定義的漂移迭代終止條件,可以設定為迭代次數滿足終止,迭代目標與中心點偏差滿足終止,或者兩者的結合;
*/
void cv::pyrMeanShiftFiltering( InputArray  src,
                                OutputArray dst,
                                double  sp,
                                double  sr,
                                int maxLevel = 1,
                                TermCriteria termcrit = TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1) 
)