自适应阈值

自适应阈值函数:

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;
}

处理结果:

图像顺序依次为:源图,普通阈值化,自适应阈值化


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值