如何在 MATLAB 的 imresize 中实现抗锯齿?

How antialiasing implemented in imresize of MATLAB?

我注意到 imresize 的抗锯齿实现如下(contributions.m,第 12-13 行):

h = @(x) scale * kernel(scale * x);
kernel_width = kernel_width / scale;

这是核函数的缩放输入输出,也扩展了内核宽度,虽然它似乎有一些直观的方面,比如根据比例扩展内核宽度。但是这个公式是怎么显式推导的,我很困惑,谁能详细解释一下这些代码背后的原理?

他们在 https://blogs.mathworks.com/steve/2017/01/16/aliasing-and-image-resizing-part-3/ 中做了一些解释。

如果你看一看,他们用信号重采样的例子解释了它。但它们也显示了图像示例和用于插值的内核图形。内核是三次插值,用于将图像修改为新的所需大小。但是,如果您想使用较小的尺寸,那么他们会使用新尺寸和先前尺寸(比例变量)的关系修改三次插值。

h = @(x) scale * kernel(scale * x);

这次修改使得三次插值的峰值更小,宽度更大,所以用它来存储宽度的值以备后用。由于比例是 < 1 的一个因素(他们使用 if 条件来确保它永远不会 > 1),宽度扩展得更多。

kernel_width = kernel_width / scale;

随着宽度变大,他们使用更多的像素来计算每个输出像素(这对于缩小图像是有意义的)。

% What is the maximum number of pixels that can be involved in the
% computation?  Note: it's OK to use an extra pixel here; if the
% corresponding weights are all zero, it will be eliminated at the end
% of this function.
P = ceil(kernel_width) + 2;