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为列数。
}
有关平滑梯度场的一个算法
最新推荐文章于 2024-03-29 07:00:00 发布