我进行了三次三次插值,即引用here 但是我发现GIMP和我自己的代码结果之间有很大的不同。 这是original image
如您所见,上面的两个图像(A)是Gimp的图像(B)是我自己的引用代码。
我很困惑我有什么问题吗?我应该更改算法吗?
请问您有什么建议吗?
答案 0 :(得分:0)
您是下采样,而不是上采样。上采样(增加像素数)时,插值本身效果很好。
在进行下采样时,如果使用不带插值的采样率,则会浪费信息,并且会产生混叠。这就是您在结果中看到的效果。
向下采样时,Gimp首先使图像平滑。平滑消除了否则会混叠的较高频率。
要获得与Gimp相似的结果,请在下采样之前应用低通滤波器。
以下是使用和不使用低通滤波进行下采样的示例。我将DIPimage与MATLAB一起使用,因为它对我来说很容易,并且您没有指定编程语言。无论如何只是为了说明原理。
我在这里使用整数因子进行直接下采样,您已经有了对非整数因子进行相同处理的代码,我不希望这会分散注意力。
s1
只是下采样,而没有平滑。看起来像您的结果。这是别名。
s2
和s3
使用大小不同的高斯低通滤波器。我在这里使用8*0.5
和8*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));