Opencv step by step - 自适应阈值


上个博客提到的阈值化只是针对图像全局进行阈值化,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);

}

这里使用了阈值化和自适应阈值的比较。可以简单的看效果,明显是自适应阈值比较容易提取特征(虽然左图好看一点):



posted @ 2014-11-20 23:52  crazy_thb  阅读(1193)  评论(0编辑  收藏  举报