gimp bicubic 和标准 bicubic 之间的区别问题
Issue of difference between gimp bicubic and standard bicubic
我做了双三次插值,它指的是
但是我发现 GIMP 的结果和我自己的代码的结果有很大的不同。
这是original image
如你所见,上面2张图片(A)是Gimp的(B)是我自己的代码,参考。
我很困惑,我做错了什么吗?我应该更改算法吗?
请问您有什么建议吗?
您正在下采样,而不是上采样。插值本身在上采样(增加像素数)时效果很好。
在缩减采样时,无论是使用插值还是不使用插值,您都会丢弃信息,并且会出现混叠。这是您在结果中看到的效果。
Gimp 在下采样时首先平滑图像。平滑消除了否则会混叠的较高频率。
要获得与 Gimp 类似的结果,请在下采样之前应用低通滤波器。
这是使用和不使用低通滤波的下采样示例。我将 MATLAB 与 DIPimage 结合使用,因为这对我来说很容易,而且您没有指定编程语言。反正就是为了说明原理。
我在这里直接使用整数因子进行下采样,您已经有了使用非整数因子执行相同操作的代码,我不想在这里分散注意力。
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));
我做了双三次插值,它指的是
如你所见,上面2张图片(A)是Gimp的(B)是我自己的代码,参考。
我很困惑,我做错了什么吗?我应该更改算法吗?
请问您有什么建议吗?
您正在下采样,而不是上采样。插值本身在上采样(增加像素数)时效果很好。
在缩减采样时,无论是使用插值还是不使用插值,您都会丢弃信息,并且会出现混叠。这是您在结果中看到的效果。
Gimp 在下采样时首先平滑图像。平滑消除了否则会混叠的较高频率。
要获得与 Gimp 类似的结果,请在下采样之前应用低通滤波器。
这是使用和不使用低通滤波的下采样示例。我将 MATLAB 与 DIPimage 结合使用,因为这对我来说很容易,而且您没有指定编程语言。反正就是为了说明原理。
我在这里直接使用整数因子进行下采样,您已经有了使用非整数因子执行相同操作的代码,我不想在这里分散注意力。
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));