我一直在尝试用特定半径rs =((int)2.75 * sigma + 0.5)的高斯核函数实现nxn图像的高斯模糊函数。围绕图像边缘的高斯模糊的“不连续”
for (x=0;x<n;x++){
for (y=0;y<n;y++){
sum=0.0,wsum=0.0;
//Position correction at the edges
if(x-rs<0){
ix=0;
}
else ix=rs;
if(y-rs<0){
iy=0;
}
else iy=rs;
if (x+rs>n-1){
jx=n-1-x;
}
else jx=rs;
if (y+rs>n-1){
jy=n-1-y;
}
else jy=rs;
//Kernel mean value correction at the edges
if (x-rs < 0){
meanx=x+((int)rs/2);
}
else meanx=x;
if(y-rs<0){
meany=y+((int)rs/2);
}
else meany=y;
if (x+rs>n-1){
meanx=x-((int)rs/2);
}
else meanx=x;
if (y+rs>n-1){
meany=y-((int)rs/2);
}
else meany=y;
for (i=x-ix;i<=x+jx;i++){
for (j=y-iy;j<=y+jy;j++){
weight=1/(2*M_PI*sigma*sigma)*exp(-((meanx-i)*(meanx-i)+(meany-j)*(meany-j))/(2*sigma*sigma));
sum+=pic1.intenzity[i][j]*weight;
wsum+=weight;
}
}
pic2->intenzity[x][y]=((int)sum/wsum+0.5);
fprintf(fw,"%d\n",pic2->intenzity[x][y]);
}
当我没有在边缘处使用平均值修正的结果是这样的:
,当我试图转移内核的平均值它创建一个间断也是在图像的右下方边缘:
with shifting the mean value to rs/2
我不得不做出边缘positio n的修正,因为总和会溢出。现在看来,高斯卷积在某些原因下突然跳跃,当它位于rs和x和y的上边和左边时。我想让它的行为与它在图像“内部”中的行为相同,或者在位置接近边缘时使强度消失为0。
我可能会通过rs放大图像,但它会导致边缘位置的问题。
感谢您
我没有看到你的计算有什么问题,但它可能是一个舍入误差。如果您将所有数据存储为浮点数或双精度执行计算,则您将转换为整数每一步的整数,然后在最后将其舍入到最接近的整数。每次你转换为int的方式都有很大的错误余量。 –
我尝试将sum/wghtsum存储到单独的浮点矩阵中,然后再将它写入int中的像素,但它做了同样的事情。 – Martin
我指的是你在几乎每一步都要做的“int”投射。确保所有类型为double的变量,并删除每个“(int)”实例,这会在包含重要数据时截断小数,尤其是因为您执行了多次计算。你可能会被大量消费。 –