1

我已经做了双三次插值,这里指的是 但是我发现 GIMP 和我自己的代码结果之间存在很大差异。这是原图

差异图像

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

我一头雾水,是不是我做错了什么?我应该改变算法吗?

你能给点建议吗?

4

1 回答 1

0

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

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

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

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


这是一个使用和不使用低通滤波的下采样示例。我将 MATLAB 与DIPimage一起使用,因为这对我来说很容易,而且您没有指定编程语言。无论如何,这只是为了说明原理。

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

s1只是下采样,没有平滑。它看起来像你的结果。这是混叠。

s2s3使用不同大小的高斯低通滤波器。我在这里使用了 sigmas8*0.5和sigmas 8*0.8。下采样后,它们分别对应于 0.5 和 0.8 的 sigma。第一个有点太小了,它仍然显示一些锯齿,但少了很多。它也仍然很锋利。第二个是防止混叠的正确尺寸(不到 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));

上面计算的 4 个图像

于 2018-06-27T15:37:31.487 回答