OpenCV_基於局部自適應閾值的圖像二值化


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

 

較為常用的圖像二值化方法有:1)全局固定閾值;2)局部自適應閾值;3)OTSU等。

 

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

 

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

 

 

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

 

下面這段代碼對比了全局固定閾值與局部自適應閾值的二值化結果。

 

[cpp]  view plain copy
 
  1. //  基於局部自適應閾值的圖像二值化  
  2. //  Author:www.icvpr.com  
  3. //  Blog:   http://blog.csdn.net/icvpr    
  4.   
  5. #include <iostream>  
  6. #include <opencv2/opencv.hpp>  
  7.   
  8. int main(int argc, char** argv)  
  9. {  
  10.     cv::Mat image = cv::imread("../test.bmp", CV_LOAD_IMAGE_GRAYSCALE);  
  11.     if (image.empty())  
  12.     {  
  13.         std::cout<<"read image failure"<<std::endl;  
  14.         return -1;  
  15.     }  
  16.   
  17.     // 全局二值化  
  18.     int th = 100;   
  19.     cv::Mat global;  
  20.     cv::threshold(image, global, th, 255, CV_THRESH_BINARY_INV);  
  21.   
  22.   
  23.     // 局部二值化  
  24.   
  25.     int blockSize = 25;  
  26.     int constValue = 10;  
  27.     cv::Mat local;  
  28.     cv::adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);  
  29.   
  30.   
  31.     cv::imwrite("global.jpg", global);  
  32.     cv::imwrite("local.jpg", local);  
  33.   
  34.     cv::imshow("globalThreshold", global);  
  35.     cv::imshow("localThreshold", local);  
  36.     cv::waitKey(0);  
  37.   
  38.   
  39.     return 0;  
  40. }  



 

 

 

 

 

 

原圖:

 

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

 

 

局部自適應閾值二值化結果(塊大小 = 25)

 

 

 

 

相關內容:www.icvpr.com

-------------------------------------------------------

< 轉載請注明:http://blog.csdn.net/icvpr >


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM