使用 OpenCV 的大津法(Otsu's method)進行全局二值化時,前景與背景分離不完美,尤其在光照不均、目標較多或亮度變化大的圖像中效果明顯下降。
大津法基於全局單一閾值,假設圖像直方圖呈雙峰分佈。當圖像存在陰影、漸變光照或多目標時,單一閾值無法適應局部特徵,導致過度或不足分割。
OpenCV 提供 adaptiveThreshold 函數,根據鄰域像素計算局部閾值,更適合光照不均場景。
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,
int adaptiveMethod, int thresholdType, int blockSize, double C);
ADAPTIVE_THRESH_MEAN_C(鄰域均值)或 ADAPTIVE_THRESH_GAUSSIAN_C(高斯加權均值,效果通常更好)。Mat src = imread("image.jpg", IMREAD_GRAYSCALE);
Mat binary;
adaptiveThreshold(src, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 15, -2);
針對目標值不連續、背景極其複雜的情況,可參考改進算法:自適應閾值操作變體,結合形態學操作(開/閉運算)去噪,進一步優化效果。
adaptiveThreshold,調整 `blockSize` 和 `C` 參數。