Vil*_*lx- 17 algorithm image-processing resampling
我想在C++中实现上面提到的两个图像重采样算法(bicubic和Lanczos).我知道有很多现有的实现,但我仍然想做自己的.我想部分原因是因为我想了解它们是如何工作的,部分是因为我想给它们一些在主流实现中找不到的功能(比如可配置的多CPU支持和进度报告).
我试过读维基百科,但这些东西对我来说太干了.也许对这些算法有一些更好的解释?我在SO或Google上找不到任何东西.
补充:似乎没有人可以给我一个关于这些主题的良好链接.任何人都可以至少尝试在这里解释一下吗?
Ant*_*sma 12
两种算法的基本操作原理都非常简单.它们都是卷积滤波器.卷积滤波器,对于每个输出值,将卷积函数原点移动到输出的中心,然后将输入中的所有值与该位置处的卷积函数的值相乘,并将它们相加.
卷积的一个特性是输出的积分是两个输入函数的积分的乘积.如果考虑输入和输出图像,则积分表示平均亮度,如果希望亮度保持不变,则卷积函数的积分需要加1.
如何理解它们的一种方法是将卷积函数视为显示输入像素根据其距离影响输出像素的程度.
通常定义卷积函数,使得当距离大于某个值时它们为零,这样您就不必考虑每个输出值的每个输入值.
对于lanczos插值,卷积函数基于sinc(x)= sin(x*pi)/ x函数,但仅采用前几个波瓣.通常3:
lanczos(x) = {
0 if abs(x) > 3,
1 if x == 0,
else sin(x*pi)/x
}
Run Code Online (Sandbox Code Playgroud)
此函数称为过滤器内核.
要使用lanczos进行重新采样,可以想象您将输出和输入叠加在一起,其中的点表示像素位置的位置.对于每个输出像素位置,您从该点获取一个+ - 3个输出像素的框.对于位于该框中的每个输入像素,计算该位置处的lanczos函数的值,其中输出像素坐标中的输出位置的距离作为参数.然后,您需要通过缩放它们来对计算值进行标准化,使它们加起来为1.然后将每个输入像素值与相应的缩放值相乘,并将结果相加以获得输出像素的值.
因为lanzos函数具有可分性属性,并且如果要调整大小,网格是常规的,您可以通过单独水平和垂直进行卷积来优化这一点,并预先计算每列的垂直过滤器和每列的水平过滤器.
双立方卷积基本相同,具有不同的滤波器核函数.
为了获得更多细节,在" 数字图像处理 "一书第16.3节中有一个非常好的和彻底的解释.
此外,image_operations.cc和convolver.cc在Skia的有一个非常良好的注释实施兰克泽斯插值.
sim*_*mon 12
虽然蚂蚁Aasma所说的粗略描述了这种差异,但我认为为什么你可以做这样的事情并不是特别有用.
就链接而言,你在图像处理中提出了一个非常基本的问题,关于这个主题的任何体面的入门教科书都将描述这一点.如果我没记错的话,冈萨雷斯和伍兹在这方面还算不错,但是我离开了我的书并无法检查.
现在谈谈细节,从根本上考虑你在做什么应该是有帮助的.您有一个正方形的测量点,您想为其插入新值.在上采样的简单情况下,让我们想象你想要在你已经拥有的每一个之间进行新的测量(例如,分辨率加倍).
现在您将无法获得"正确"值,因为通常您没有这些信息.所以你必须估计它.这该怎么做?一种非常简单的方法是线性插值.每个人都知道如何用两个点来做这个,你只需在它们之间划一条线,并从线上读取新值(在这种情况下,在中间点).
现在图像是二维的,所以你真的想要在左右和上下两个方向上这样做.使用结果进行估算,瞧你有"双线性"插值.
这个问题的主要问题是它不是很准确,尽管它比"最近邻"方法更好(也更慢),而且最近邻也是非常本地和快速的方法.
为了解决第一个问题,你想要比两点的线性拟合更好的东西,你想要适合更多数据点(像素),以及可以是非线性的东西.精度和计算成本的良好折衷是称为三次样条.因此,这将为您提供平滑的拟合线,并再次通过中间所需的值来近似您的新"测量".在两个方向都这样做,你有"双三次"插值.
所以这更准确,但仍然很重.解决速度问题的一种方法是使用卷积,它具有很好的属性,在傅里叶域中,它只是一个乘法,所以我们可以很快地实现它.但是您不必担心实现会理解卷积结果在任何时候都是一个函数(您的图像)被集成在另一个函数中,通常是更小的支持(非零部分)函数称为内核之后,内核已经在该特定点上居中.在离散的世界中,这些只是产品的总和.
事实证明,你可以设计一个具有与三次样条相似的属性的卷积核,并使用它来获得快速的"双三次"
Lancsoz重采样是一个类似的东西,在内核中具有略微不同的属性,这主要意味着它们将具有不同的特征伪像.您可以轻松地查找这些内核函数的详细信息(我确定维基百科有它们,或任何介绍文本).图形程序中使用的实现往往是高度优化的,有时会有专门的假设,使它们更有效但不太通用.