对灰度图像应用自适应阈值,将图像转换成二值图像
参数:
src | 8位源单通道图像 |
dst | 与src相同大小、相同类型的目标图像 |
maxValue | 分配给满足条件的像素的非零值 |
adaptiveMethod | 使用的自适应阀值算法,参考 cv::AdaptiveThresholdTypes |
thresholdType | 阀值类型:THRESH_BINARY or THRESH_BINARY_INV |
blockSize | 用于计算像素阈值的像素邻域的大小:3、5、7等 |
C | 常数减去平均数或加权平均数(见下文)。通常,它是正的,但也可能是零或负的。 |
/** Adaptive threshold methods */
enum
{
CV_ADAPTIVE_THRESH_MEAN_C =0,
CV_ADAPTIVE_THRESH_GAUSSIAN_C =1
};
使用以上自适应阀值方法时,自适应阀值T(X,Y)在每个像素点都不同。通过计算像素点周围的bxb区域的加权平均,然后减去一个常数来得到自适应阀值,b由参数blocksize指定,常数C指定。如果使用CV_ADAPTIVE_THRESH_MEAN_C,那么对区域的所有像素平均加权,如果使用了CV_ADAPTIVE_THRESH_GAUSSIAN_C方法,那么区域中的(x,y)周围的像素根据高斯函数按照它们离中心点的距离进行加权计算。
thresholdType 是和cvThreshold一样的。
test:
#include <cv.h>
#include <highgui.h>
#include <math.h>
IplImage *Igray=0, *It = 0, *Iat;
int main( int argc, char** argv ){
if(argc != 7){return -1; }
//Command line
double threshold = (double)atof(argv[1]);
int threshold_type = atoi(argv[2])?
CV_THRESH_BINARY : CV_THRESH_BINARY_INV;
int adaptive_method = atoi(argv[3])?
CV_ADAPTIVE_THRESH_MEAN_C : CV_ADAPTIVE_THRESH_GAUSSIAN_C;
int block_size = atoi(argv[4]);
double offset = (double)atof(argv[5]);
//Read in gray image
if((Igray = cvLoadImage( argv[6], CV_LOAD_IMAGE_GRAYSCALE)) == 0){
return -1;
}
// Create the grayscale output images
It = cvCreateImage(cvSize(Igray->width,Igray->height),
IPL_DEPTH_8U, 1);
Iat = cvCreateImage(cvSize(Igray->width,Igray->height),
IPL_DEPTH_8U, 1);
//Threshold
cvThreshold(Igray,It,threshold,255,threshold_type);
cvAdaptiveThreshold(Igray, Iat, 255, adaptive_method,
threshold_type, block_size, offset);
//PUT UP 2 WINDOWS
cvNamedWindow("Raw",1);
cvNamedWindow("Threshold",1);
cvNamedWindow("Adaptive Threshold",1);
//Show the results
cvShowImage("Raw",Igray);
cvShowImage("Threshold",It);
cvShowImage("Adaptive Threshold",Iat);
cvWaitKey(0);
//Clean up
cvReleaseImage(&Igray);
cvReleaseImage(&It);
cvReleaseImage(&Iat);
cvDestroyWindow("Raw");
cvDestroyWindow("Threshold");
cvDestroyWindow("Adaptive Threshold");
return(0);
}
测试:
结果:
灰度图像
自适应阀值图像 CV_ADAPTIVE_THRESH_MEAN_C
固定阀值=15