有关平滑梯度场的一个算法

template<class T> void Image::ImageSmooth(T object, int l)//将图像平滑,取周围(2*l+1)边长正方形内的点的均值
{
	int cnt, sum, rowCnt;
	int colSum[MAX_IMAGE_X];

	fr(j,imageX) colSum[j] = 0;//
	rowCnt = 0;//用于存储整形放的边长包含了多少个点

	int si,ei,sj,ej;
	si = ei = 0;

	fr(i,imageY)
	{
		while(ei <= i+l && ei < imageY)
		{
			rowCnt ++;
			fr(j,imageX) colSum[j] += object[ei][j];
			ei++;
		}
		while(si < i-l && si < imageY)
		{
			rowCnt --;
			fr(j,imageX) colSum[j] -= object[si][j];
			si++;
		}

		sum = 0;//点的值的总数
		cnt = 0;//点的总数
		sj = ej = 0;
		fr(j,imageX)
		{
			while(ej <= j+l && ej < imageX)
			{
				cnt += rowCnt;
				sum += colSum[ej];
				ej ++;
			}
			while(sj < j-l && sj < imageX)
			{
				cnt -= rowCnt;
				sum -= colSum[sj];
				sj ++;
			}
			tempObject[i][j] = sum/cnt;//即当前点的均值
		}
	}
	fr(i,imageY) fr(j,imageX)
	{
		object[i][j] = tempObject[i][j];
	}
	//此算法是将整个需要处理的正方形区域进行N次的向右移动,N为列数。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值