阈值化函数:
double cvTreshold(
CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
根据源图像的像素和阈值之间的关系,目标图像的像素可能被设置为0,src_i或max_value(下表中表示为M)
cvTreshold()中阈值类型选项和对应的操作
1、CV_THRESH_BINARY dst_i=(src_i>T)?M:0
2、CV_THRESH_BINARY_INV dst_i=(src_i>T)?0:M
3、CV_THRESH_TRUNC dst_i=(src_i>T)?M:src_i
4、CV_THRESH_TOZERO_INV dst_i=(src_i>T)?0:src_i
5、CV_THRESH_TOZERO dst_i=(src_i>T)?src_i:0
示例程序:
#include<cstdio>
#include<cv.h>
#include<highgui.h>
void Sum_RGB(IplImage *src,IplImage *dst)
{
//分配单通道图像结构
IplImage *r=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage *g=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
IplImage *b=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
//将图像保存到单通道图像上
cvSplit(src,r,g,b,NULL);
//临时存储区域
IplImage *s=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
//将三个通道按相同比例求和存到s中
cvAddWeighted(r,1./3.,g,1./3.,0.0,s);
cvAddWeighted(s,1.0,b,1./3.,0.0,s);
//剔除大于100的像素点
cvThreshold(s,dst,100,100,CV_THRESH_TRUNC);
cvReleaseImage(&r);
cvReleaseImage(&g);
cvReleaseImage(&b);
cvReleaseImage(&s);
}
int main()
{
cvNamedWindow("阈值化",1);
//载入图像
IplImage *src=cvLoadImage("Image.jpg");
IplImage *dst=cvCreateImage(cvGetSize(src),src->depth,1);
Sum_RGB(src,dst);
//显示处理结果
cvShowImage("阈值化",dst);
while(true)
{
if((cvWaitKey(10)&0x7f)==27)
break;
}
cvDestroyWindow("阈值化");
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}