迭代阈值法

通过迭代方法选择阈值, 计算方法如下:

(1)选择灰度图的平均值作为初始阈值T0 ;

(2)计算小于等于T0的平均值T1, 和大于T0的平均值T2;

(3)新的阈值为T = (T1 + T2)/ 2;

(4)比较T和T0,若相等,则返回T,即为迭代阈值; 否则 T0 = T,重复(1)-(3)

#include"cv.h"
#include "highgui.h"

int IterationThreshold(CvMat* gray);
int main()
{
	IplImage *src = cvLoadImage("flower.jpg",1);

	const int width = src->width;
	const int height = src->height;

	CvMat *gray = cvCreateMat(height, width, CV_8UC1);
	cvCvtColor(src, gray, CV_BGR2GRAY);

    int thres = IterationThreshold(gray);
	cvThreshold(gray, gray, thres, 255, CV_THRESH_BINARY);

	cvShowImage("SRC", src);
	cvShowImage("GRAY", gray);
	cvWaitKey(0);

	cvCvtColor(gray, src, CV_GRAY2BGR);
	cvSaveImage("DST.bmp", src);

	cvReleaseMat(&gray);
	return 0;
}
int IterationThreshold(CvMat* gray)
{
	int width = gray->width;
	int height = gray->height;

	//直方图统计
	int histData[256] = {0};
	for(int j = 0; j < height; j ++)
	{
		uchar*data = (uchar*)(gray->data.ptr + j * gray->step);
		for (int i = 0; i < width; i ++)
		{
			histData[data[i]]++;
		}
	}

	//求图像的平均灰度值作为初始阈值
	int T0 = 0;
	for (int i = 0; i < 256; i ++)
	{
		T0 += i * histData[i];
	}
	T0 /= width * height;

	//迭代
	int T1 = 0, T2 = 0;
	int num1 = 0, num2 = 0;
	int T = 0;
	while (1)
	{
		for ( int i = 0; i < T0+1; i ++)
		{
			T1 += i * histData[i];
			num1 += histData[i];
		}

		if (num1 == 0)
			continue;

		for ( int i = T0 + 1; i < 256; i ++)
		{
			T2 += i * histData[i];
			num2 += histData[i];
		}

		if (num2 == 0)
			continue;

		T = (T1 / num1  + T2 / num2) / 2;

		if ( T == T0 )
			break;
		else
			T0 = T;
	}

	return T;
}
源图和效果图如下:



  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值