自适应阈值函数:
void vcAdaptiveThreshold(
CvArr * src,
CvArr * dst,
double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C,
int threshold_type= CV_THRESH_BINARY,
int block_size = 3,
double param =5
);
cvAdaptiveThreshold()有两种不同的阈值方法,可以用参数adaptive_method进行设置。
自适应阈值T(x,y)在每个像素点都不同。通过计算像素点周围b*b区域的加权平均,然后减去一个常数来得到自适应阈值,b由参数block_size(请设置为奇数,不然出错)指定,常数有param指定。
如果使用CV_ADAPTIVE_THRESH_MEAN_C方法,那么对区域的所有像素平均加权。
如果使用CV_ADAPTIVE_THRESH_GAUSSIAN_C方法,那么区域中(x,y)周围的像素根据高斯函数按照他们中心点的距离进行加权计算。
threshhold_type与普通阈值化的类型是一样的。
此函数只能处理单通道8位图像或浮点图像,它要求源图像与目标图像不一样
示例:
#include "cv.h"
#include "highgui.h"
#include "math.h"
#include <string>
#include <iostream>
using namespace std;
string g_window_names[3]={"原始图像","简单阈值化","自适应阈值化"};
IplImage *pGray=0,*pIt=0,*pIat;
int main()
{
double threshold=15;
int threshholdType=CV_THRESH_BINARY;
int adaptiveMethod=CV_ADAPTIVE_THRESH_MEAN_C;
int blockSize=71;
double offset=15.0;
//单通道载入图像
if((pGray=cvLoadImage("Image.jpg",CV_LOAD_IMAGE_GRAYSCALE))==0)
return -1;
pIt=cvCreateImage(cvSize(pGray->width,pGray->height),IPL_DEPTH_8U,1);
pIat=cvCreateImage(cvSize(pGray->width,pGray->height),IPL_DEPTH_8U,1);
//简单阈值化
cvThreshold(pGray,pIt,threshold,255,threshholdType);
//自适应阈值化
cvAdaptiveThreshold(pGray,pIat,255,adaptiveMethod,threshholdType,blockSize,offset);
cvNamedWindow(g_window_names[0].c_str(),1);
cvNamedWindow(g_window_names[1].c_str(),1);
cvNamedWindow(g_window_names[2].c_str(),1);
cvShowImage(g_window_names[0].c_str(),pGray);
cvShowImage(g_window_names[1].c_str(),pIt);
cvShowImage(g_window_names[2].c_str(),pIat);
cvWaitKey(0);
cvReleaseImage(&pGray);
cvReleaseImage(&pIat);
cvReleaseImage(&pIt);
for(int i=0;i<3;i++)
cvDestroyWindow(g_window_names[i].c_str());
return 0;
}
处理结果:
图像顺序依次为:源图,普通阈值化,自适应阈值化