【從零學習OpenCV 4】分割影像——Mean-Shift分割演算法
- 2020 年 3 月 5 日
- 筆記
Mean-Shift演算法又被稱為均值漂移法,是一種基於顏色空間分布的影像分割演算法。該演算法的輸出是一個經過濾色的「分色」影像,其顏色會變得漸變,並且細紋紋理會變得平緩。
在Mean-Shift演算法中每個像素點用一個五維的向量表示,前兩個量是像素點在影像中的坐標,後三個量是每個像素點的顏色分量(藍、綠、紅)。在顏色分布的峰值處開始,通過滑動窗口不斷尋找屬於同一類的像素點並統一像素點的像素值。滑動窗口由半徑和顏色幅度構成,半徑決定了滑動窗口的範圍,即坐標的範圍,顏色幅度決定了半徑內像素點分類的標準。這樣通過不斷地移動滑動窗口,實現基於像素點顏色的影像分割。由於分割後同一類像素點具有相同像素值,因此Mean-Shift演算法的輸出結果是一個顏色漸變、紋理平緩的影像。
OpenCV 4中提供了實現Mean-Shift演算法分割影像的pyrMeanShiftFiltering()函數,該函數的函數原型在程式碼清單8-23中給出。
程式碼清單8-23 pyrMeanShiftFiltering()函數原型 void cv::pyrMeanShiftFiltering(InputArray src, OutputArray dst, double sp, double sr, int maxLevel = 1, TermCriteria termcrit = TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1) 8. )
- src:待分割的輸入影像,必須是三通道CU_8U的彩色影像
- dst:分割後的輸出影像,與輸入影像具有相同的尺寸和數據類型
- sp:滑動窗口的半徑
- sr:滑動窗口顏色幅度
- maxLevel:分割金字塔縮放層數
- termcrit:迭代演算法終止條件。
該函數基於彩色影像的像素值實現對影像的分割,函數的輸出結果是經過顏色分布平滑的影像。經過該函數分割後的影像具有較少的紋理資訊,可以利用邊緣檢測函數Canny()以及連通域查找函數findContours()進行進一步細化分類和處理。函數前兩個參數是待分割的輸入影像和分割後的輸出影像,兩個影像具有相同的尺寸並且必須是CV_8U的三通道彩色影像。第三個參數為滑動窗口的半徑,第四個參數為滑動窗口的顏色幅度。第五個參數為分割金字塔縮放層數,當參數大於1時構建maxLevel + 1層高斯金字塔。該演算法首先在尺寸最小的影像層中進行分類,之後將結果傳播到尺寸較大的影像層,並且僅在顏色與上一層顏色差異大於滑動窗口顏色幅度的像素上再次進行分類,從而使得顏色區域的邊界更清晰。當分割金字塔縮放層數為0時表示直接在整個原始影像時進行均值平移分割。函數最後一個參數表示演算法迭代停止的條件,該參數的數據類型是TermCriteria,該數據類型是OpenCV 4中用於表示迭代演算法終止條件的數據類型,在所有涉及到迭代條件的函數中都有該參數,用於表示在滿足某些條件時函數將停止迭代並輸出結果。TermCriteria變數可以通過TermCriteria()函數進行賦值,該函數的函數原型在程式碼清單8-24中給出。
程式碼清單8-24 TermCriteria()函數原型 cv::TermCriteria::TermCriteria(int type, int maxCount, double epsilon )
- type:終止條件的類型標誌,可以選擇的參數及含義在表8-6中給出。
- maxCount:最大迭代次數或者元素數。
- epsilon:迭代演算法停止時需要滿足的精度或者參數變化。
該函數可以表示迭代演算法的終止條件,主要分為滿足迭代次數和滿足計算精度兩種。函數第一個參數是終止條件的類型標誌,其可選參數在表8-6中給出,這幾個標誌可以互相結合使用,需要注意的是,由於該參數在TermCriteria類中,因此在使用時需要在變數前面添類名前綴。函數第二個參數表示最大迭代次數,在epsilon== TermCriteria::COUNT時發揮作用。函數第三個參數表示停止迭代時需要滿足的計算精度,在epsilon== TermCriteria::EPS時發揮作用。
標誌參數 |
簡記 |
含義 |
---|---|---|
TermCriteria::COUNT |
1 |
迭代次數達到設定值才停止迭代 |
TermCriteria::MAX_ITER |
1 |
同上 |
TermCriteria::EPS |
2 |
當計算的精度滿足要求時停止迭代 |