上个博客提到的阈值化只是针对图像全局进行阈值化,opencv提供了一个更好的函数cvAdaptiveThreshold,可以做到局部特征的阈值化,这样一来,
整个图像的信息可以被更好的提取。
#include <cv.h>
#include <highgui.h>
#include "math.h"
IplImage *img_gray = NULL, *img_thres = NULL, *img_adaptive = NULL;
int main(int argc, char **argv)
{
double threadshould = 100.0;
int threadshould_type = CV_THRESH_BINARY;
int adaptive_method = CV_ADAPTIVE_THRESH_GAUSSIAN_C;
int block_size = 11;
double offset = 5;
if(NULL == (img_gray = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE)))
return -1;
img_thres = cvCreateImage(cvGetSize(img_gray), img_gray->depth, 1);
img_adaptive = cvCreateImage(cvGetSize(img_gray), img_gray->depth, 1);
cvThreshold(img_gray, img_thres, threadshould, 255, threadshould_type);
cvAdaptiveThreshold(img_gray, img_adaptive, 255, adaptive_method, threadshould_type, block_size, offset);
cvNamedWindow("ORG", 1);
cvNamedWindow("THRES", 1);
cvNamedWindow("ADAPTIVE_THRES", 1);
cvShowImage("ORG", img_gray);
cvShowImage("THRES", img_thres);
cvShowImage("ADAPTIVE_THRES", img_adaptive);
while(1) {
if(cvWaitKey(10) & 0x7f == 27)
break;
}
cvDestroyWindow("ORG");
cvDestroyWindow("THRES");
cvDestroyWindow("ADAPTIVE_THRES");
cvReleaseImage(&img_gray);
cvReleaseImage(&img_thres);
cvReleaseImage(&img_adaptive);
}
这里使用了阈值化和自适应阈值的比较。可以简单的看效果,明显是自适应阈值比较容易提取特征(虽然左图好看一点):