在哪里可以找到有关三次三次插值和Lanczos重采样的良好阅读?
image-processing
7
0

我想在C ++中实现上述两个图像重采样算法(bicubic和Lanczos)。我知道那里有许多现有的实现,但是我仍然想自己做。我之所以想这样做,部分是因为我想了解它们的工作原理,部分是因为我要给它们一些主流实现中没有的功能(例如可配置的多CPU支持和进度报告)。

我尝试阅读Wikipedia,但是对我来说,这些内容太干了。也许对这些算法有一些更好的解释?我在SO或Google上都找不到任何东西。

补充:似乎没有人可以给我关于这些主题的良好链接。至少有人可以在这里解释一下吗?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我想建议以下文章对通过卷积进行图像插值的不同图像插值方法有基本的了解。如果您想尝试更多的插值方法,那么imageresampler是一个很好的开源项目。

我认为可以从两个方面理解图像插值,一个是从函数拟合的角度,一个是从卷积的角度。例如,从三次拟合插值中的函数拟合角度很好地解释了通过卷积进行图像插值中说明的样条插值

此外,图像插值始终与特定的应用程序相关,例如图像缩放,图像旋转等。实际上,对于特定的应用,可以通过智能方式实现图像插值。例如,可以通过三剪切方法实现图像旋转,并且在每次剪切操作期间,可以实现不同的一维插值算法。

收藏
评论

尽管Ants Aasma所说的内容大致描述了这种差异,但我认为这对您为什么要这样做的意义不大。

就链接而言,您要问的是图像处理中的一个非常基本的问题,任何有关该主题的体面入门教科书都将对此进行描述。如果我没记错的话, 冈萨雷斯和伍兹对此很体面,但是我远离书本,无法检查。

现在开始讲细节,应该有助于从根本上考虑您在做什么。您有一个要插入新值的测量方阵。在上采样的简单情况下,假设您想要在已有的每个测量之间进行新的测量(例如,将分辨率提高一倍)。

现在,您将不会获得“正确”的值,因为通常您没有该信息。所以你必须估计一下。这个怎么做?一种非常简单的方法是线性插值。每个人都知道如何用两点来做到这一点,您只需在两点之间画一条线,然后从该线中读取新值(在本例中为中点)。

现在图像是二维的,因此您确实想在左右和上下方向上进行此操作。将结果用于您的估计,并且您会得出“双线性”插值。

这样做的主要问题是它不是很准确,尽管比“最近邻居”方法(也非常本地且快速)更好(也更慢)。

为了解决第一个问题,您想要的东西要好于两点的线性拟合,您想要的东西适合更多的数据点(像素),而某些东西可以是非线性的。在精度和计算成本之间进行很好的权衡是一种三次样条。因此,这将为您提供一条平滑的拟合线,并再次通过中间的值近似估算新的“度量”。双向执行此操作,您将获得“双三次”插值。

这样虽然更准确,但仍然很沉重。解决速度问题的一种方法是使用卷积,它具有很好的属性,即在傅立叶域中,它只是一个乘法,因此我们可以很快实现它。但是您无需担心实现,就可以理解卷积结果在任何时候都是一个功能(您的图像)被集成到另一个产品中,通常是支持量更小的(非零部分)称为内核的功能。 ),在该内核位于该特定点的中心之后。在离散世界中,这些只是乘积之和。

事实证明,您可以设计具有类似于三次样条的属性的卷积核,并使用它来获得快速的“双三次”

Lancsoz重采样是类似的事情,内核中的属性稍有不同,这主要意味着它们将具有不同的特征工件。您可以轻松地查找这些内核功能的详细信息(我确定Wikipedia拥有它们,或任何介绍性文字)。图形程序中使用的实现往往会进行高度优化,并且有时会有专门的假设,这些假设会使它们更加有效,但通用性较低。

收藏
评论

两种算法的基本操作原理都非常简单。它们都是卷积过滤器。卷积滤波器,对于每个输出值,将卷积函数的原点移动到输出的中心,然后将输入中的所有值与该位置处的卷积函数的值相乘,并将它们相加。

卷积的一个属性是输出的积分是两个输入函数的积分的乘积。如果考虑输入和输出图像,则积分表示平均亮度,如果希望亮度保持不变,则卷积函数的积分需要加一。

了解它们的一种方法是将卷积函数视为某种东西,该函数可以显示多少输入像素取决于它们的距离而影响输出像素。

通常定义卷积函数,以便当距离大于某个值时它们为零,这样您就不必为每个输出值都考虑每个输入值。

对于Lanczos插值,卷积函数基于sinc(x)= sin(x * pi)/ x函数,但仅采用前几个波瓣。通常3:

lanczos(x) = {
    0 if abs(x) > 3,
    1 if x == 0,
    else sin(x*pi)/x
}

此功能称为过滤器内核。

要使用lanczos进行重新采样,请想象您将输出和输入彼此重叠,并用点表示像素位置。对于每个输出像素位置,从该点开始,取一个框+-3个输出像素。对于该框中的每个输入像素,请以该位置的输出像素坐标中与输出位置的距离为参数,计算该位置处lanczos函数的值。然后,您需要通过缩放计算值来对其进行归一化,以使它们的总和为1。之后,将每个输入像素值与相应的缩放值相乘,然后将结果相加在一起,得出输出像素的值。

因为lanzos函数具有可分离性属性,并且如果要调整大小,则网格是规则的,因此可以通过分别水平和垂直进行卷积并预先计算每行的垂直过滤器和每列的水平过滤器来优化此方法。

双三次卷积基本相同,只是滤波器内核函数不同。

要获得更多详细信息,请在《 数字图像处理 》一书的第16.3节中进行很好的全面解释。

此外, image_operations.ccconvolver.cc在Skia的有一个非常良好的注释实施兰克泽斯插值。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号