如何最小化笛卡尔到极坐标变换的伪影,然后是极坐标到笛卡尔变换?

计算科学 算法 C++ 插值 图像处理
2021-12-21 12:15:58

我正在将笛卡尔图像转换为极坐标图像。(x,y) => (角度, 半径)

我通过迭代每个像素来填充极坐标图像,并通过进行反向极坐标变换来填充它们。对于给定的(角度,半径)对,我在源笛卡尔图像中的以下位置进行插值:

xcartesianpoint = cos( angle ) * radius + center.x;
ycartesianpoint = sin( angle ) * radius + center.y;

(我用极坐标图像做了一些计算)

然后我将极坐标图像转换回笛卡尔坐标。同样,我通过进行逆变换来填充目标图像。对于给定的 (x,y) 点,我从位于以下位置的极坐标图像点插入值:

angle  = atan2(ycartesianPxl, xcartesianPxl) + M_PI;
radius = getRadius(xcartesianPxl, ycartesianPxl);

xpolarpoint = angle /_angleStep; // give the index in the polar image corresponding to the angle
ypolarpoint = (polarImage.height / maxRadius) * radius;

点索引是我用来在给定变换的源图像中插值的浮点值。

这段代码运行良好,但会产生类似的伪像(第一张图像是源,第二张是极坐标转换后的源,以笛卡尔坐标转换回。伪像在远离中心的像素上更明显):

源图像 http://imageshack.us/a/img539/3131/932528.png 转换后的图像 http://imageshack.us/a/img631/5459/3b3365.png

编辑

我如何处理我的极地图像:

我正在对源图像进行极性转换,以使其模糊。这样做是为了获得像模糊一样的缩放/螺旋。模糊是通过对转换回来的极坐标图像进行 FFT 来完成的。如果整个图像被模糊,伪影就不会成为问题,但用户可以指定一个增益遮罩来调制每个像素的模糊半径。因此,一些像素可能完全模糊,而另一些则根本没有。

1个回答

由于您的极坐标表示的底层网格随着您远离中心而在圆周上变得更粗糙,因此您在那里得到伪影也就不足为奇了。我最简单的建议是在极坐标表示中使用更多像素。

我不清楚你是如何从你提供的代码中“插值”的。您是否只是从最近的像素中获取值?最小二乘插值可能会更好 - 对于您要为其查找颜色的给定像素,找到前一个图像的 4 个周围像素并计算由它们距离的倒数加权的平均值。

我可以想到三个选项:

  1. 显着提高极坐标表示的分辨率。
  2. 代替线性插值,创建图像的光谱表示(例如通过 FFT)。这将更加准确。
  3. 对最终图像或抗锯齿应用模糊/高斯过滤器。这实际上不会提高转换的质量,但会消除锯齿状的边界边缘。