阈值化函数:
double cvThreshold(constCvArr* src, CvArr* dst, double threshold, double max_value,int threshold_type)
参数:
src –原始数组 (单通道 , 8-bit of 32-bit 浮点数)。
dst –输出数组,必须与 src 的类型一致,或者为 8-bit。
thresh –阈值。
max_value –使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
threshold_type –对图像取阈值的方法。
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, ifsrc(x,y)>threshold
0, otherwise.
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, ifsrc(x,y)>threshold;
dst(x,y) = max_value, otherwise.
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, ifsrc(x,y)>threshold;
dst(x,y) = src(x,y), otherwise.
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if(x,y)>threshold ;
dst(x,y) = 0, otherwise.
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, ifsrc(x,y)>threshold ;
dst(x,y) = src(x,y), otherwise.
threshold_type可以使用CV_THRESH_OTSU类型,这样该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起作用。
如:cvThreshold(workImg,workImg,0, 255, CV_THRESH_OTSU|CV_THRESH_BINARY)
自适应阈值函数:
voidcvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value, intadaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,
intthreshold_type=CV_THRESH_BINARY, int block_size=3, double param1=5 );
参数:
src-输入图像.
dst-输出图像.
max_value-使用 CV_THRESH_BINARY 和CV_THRESH_BINARY_INV 的最大值.
adaptive_method-自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C .
threshold_type-取阈值类型:必须是CV_THRESH_BINARY或者CV_THRESH_BINARY_INV.
block_size-用来计算阈值的象素邻域大小: 3, 5, 7, ...
param1-与方法有关的参数。对方法 CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C,
它是一个从均值或加权均值提取的常数,尽管它可以是负数。
对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian),再减掉param1。
当block_size比较小的时候,相当于提取边缘。
结果对比:
阈值化结果如下:
Otsu结果如下:
自适应阈值结果如下: