gimp bicubic 和标准 bicubic 之间的区别问题

Issue of difference between gimp bicubic and standard bicubic

我做了双三次插值,它指的是 但是我发现 GIMP 的结果和我自己的代码的结果有很大的不同。 这是original image

如你所见,上面2张图片(A)是Gimp的(B)是我自己的代码,参考。

我很困惑,我做错了什么吗?我应该更改算法吗?

请问您有什么建议吗?

您正在下采样,而不是上采样。插值本身在上采样(增加像素数)时效果很好。

在缩减采样时,无论是使用插值还是不使用插值,您都会丢弃信息,并且会出现混叠。这是您在结果中看到的效果。

Gimp 在下采样时首先平滑图像。平滑消除了否则会混叠的较高频率。

要获得与 Gimp 类似的结果,请在下采样之前应用低通滤波器。


这是使用和不使用低通滤波的下采样示例。我将 MATLAB 与 DIPimage 结合使用,因为这对我来说很容易,而且您没有指定编程语言。反正就是为了说明原理。

我在这里直接使用整数因子进行下采样,您已经有了使用非整数因子执行相同操作的代码,我不想在这里分散注意力。

s1 只是降采样,没有平滑。它看起来像你的结果。这是别名。

s2s3 使用不同大小的高斯低通滤波器。我在这里使用了 8*0.58*0.8 的西格玛。下采样后,它们分别对应于 0.5 和 0.8 的西格玛。第一个有点太小了,它仍然显示出一些锯齿,但少了很多。它也仍然很锋利。第二个是防止混叠的正确尺寸(混叠的能量不到 1% 左右)。

s4 使用理想的低通滤波(在傅里叶域)。我不推荐这种方法,因为它会导致很多振铃。这里只是为了比较。输出中有 0% 的混叠,结果在这个尺寸下尽可能清晰。

a = readim('https://i.stack.imgur.com/1TyGI.jpg');
a = a{1};

f = 8; % subsample by a factor 8

s1 = a(0:f:end,0:f:end);

s2 = gaussf(a,f*0.5);
s2 = s2(0:f:end,0:f:end);

s3 = gaussf(a,f*0.8);
s3 = s3(0:f:end,0:f:end);

s4 = ft(a);
s4 = cut(s4,imsize(s1));
s4 = real(ift(s4) / numel(a) * numel(s4));