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

template 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为列数。
}

你可能感兴趣的:(有关平滑梯度场的一个算法)