1. 程式人生 > >emgucv自適應二值化

emgucv自適應二值化

一、理論概述(轉載自《OpenCV_基於區域性自適應閾值的影象二值化》)

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

二、程式實現

1、關鍵函式

關鍵函式 CvInvoke.cvAdaptiveThreshold Method

函式功能:

Transforms grayscale image to binary image. Threshold calculated individually for each pixel. For the method CV_ADAPTIVE_THRESH_MEAN_C it is a mean of blockSize x blockSize pixel neighborhood, subtracted by param1. For the method CV_ADAPTIVE_THRESH_GAUSSIAN_C it is a weighted sum (gaussian) of blockSize

 x blockSize pixel neighborhood, subtracted by param1.

函式原型:

public static void cvAdaptiveThreshold(

         IntPtr src,

         IntPtr dst,

         

double maxValue,

         ADAPTIVE_THRESHOLD_TYPE adaptiveType,

         THRESH thresholdType,

         int blockSize,

         double param1

)

第一個引數src表示輸入影象,必須為單通道灰度圖。

第二個引數dst表示輸出的邊緣影象,為單通道黑白圖。

第三個引數maxValue表示採用CV_THRESH_BINARY 和CV_THRESH_BINARY_INV門限型別的最大值。

第四個引數adaptiveType表示區域性二值化閾值的取值方法,自適應閾值演算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C,ADAPTIVE_THRESHOLD_TYPE列舉型別。

第五個引數thresholdType表示取閾值型別:必須是下者之一

  • CV_THRESH_BINARY,
  • CV_THRESH_BINARY_INV

第六個引數block_size代表用來計算閾值的象素鄰域大小,例如:3,5,7…

第七個引數表示均值或高斯加權平均值所需要減去的一個常數,類似一個人工干預的閾值調整。

對方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出塊中的均值,再減掉param1。

對方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出塊中的加權和(gaussian), 再減掉param1。

//區域性二值化
Image<Gray, Byte> adaptivethreshimg = new Image<Gray, Byte>(graymi.width, graymi.height);
CvInvoke.cvAdaptiveThreshold(grayimg, adaptivethreshimg, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 25, 5);
pictureBox4.Image = adaptivethreshimg.ToBitmap();