1. 程式人生 > >OpenCV基於區域性自適應閾值的影象二值化

OpenCV基於區域性自適應閾值的影象二值化

在影象處理應用中二值化操作是一個很常用的處理方式,例如零器件圖片的處理、文字圖片和驗證碼圖片中字元的提取、車牌識別中的字元分割,以及視訊影象中的運動目標檢測中的前景分割,等等。

較為常用的影象二值化方法有:1)全域性固定閾值;2)區域性自適應閾值;3)OTSU等。

全域性固定閾值很容易理解,就是對整幅影象都是用一個統一的閾值來進行二值化;

區域性自適應閾值則是根據畫素的鄰域塊的畫素值分佈來確定該畫素位置上的二值化閾值。這樣做的好處在於每個畫素位置處的二值化閾值不是固定不變的,而是由其周圍鄰域畫素的分佈來決定的。亮度較高的影象區域的二值化閾值通常會較高,而亮度較低的影象區域的二值化閾值則會相適應地變小。不同亮度、對比度、紋理的區域性影象區域將會擁有相對應的區域性二值化閾值。常用的區域性自適應閾值有:1)區域性鄰域塊的均值;2)區域性鄰域塊的高斯加權和。

OpenCV中實現了以上幾種二值化方法。

下面這段程式碼對比了全域性固定閾值與區域性自適應閾值的二值化結果。

#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, char** argv)
{
 cv::Mat image = cv::imread("../test.bmp", CV_LOAD_IMAGE_GRAYSCALE);
 if (image.empty())
 {
  std::cout<<"read image failure"<<std::endl;
  return -1;
 }


 // 全域性二值化
 int th = 100;
 cv::Mat global;
 cv::threshold(image, global, th, 255, CV_THRESH_BINARY_INV);


 // 區域性二值化

 int blockSize = 25;
 int constValue = 10;
 cv::Mat local;
 cv::adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);


 cv::imshow("globalThreshold", global);
 cv::imshow("localThreshold", local);
 cv::waitKey(0);


 return 0;
}

原圖:

全域性固定閾值二值化結果(T = 100)

區域性自適應閾值二值化結果(塊大小 = 25)

[