智能降采样算法探究

信号处理图像处理领域,曲线简化是一个重要的研究课题。本文提出了一种名为“智能降采样”的新方法,旨在通过不同的技术手段实现曲线的简化和平滑。众所周知,通过添加零或移除相同样本,可以使用FFT进行多速率重采样来获取简化的曲线。本文将总结一些已知的简化算法,如Douglas-Peucker算法、Visvalingam-Whyatt算法、基于曲率的简化算法、最大平方距离算法、Reumann-Witkam算法、Opheim算法、Lang算法以及Nth点算法等。

在继续之前,强烈推荐阅读CodeProject上Elmar de Koning撰写的“Polyline Simplification”文章。

方法介绍

假设有3个点,想要得到5个点(即插值),或者有5个点,想要得到3个点(即降采样)。这种方法可以用于这两种情况。在这里,将其用于降采样。这种方法实际上与双线性插值非常相似,但在所有方面都有很大的不同。知道,在图像处理中,有一些著名的算法用于图像大小调整:

  • 最近邻,即直接复制
  • 双线性插值
  • 双三次插值
  • Sinc/Lanczos插值

从视觉上看,算法的质量比双线性好,但比双三次差。在放大时,它比其他方法有更少或没有伪影(即混叠、模糊、边缘光晕)。

解释底层逻辑的最好方法是使用逐步插图。

另一种解释(1D数据)

例如,假设有11个值:41, 79, 9, 36, 11, 33, 23, 46, 36, 88, 89。现在,想要得到只有3个值,而不失数据集的主要特征。步骤非常简单和容易:Kronicker乘法,然后重新组合数据,最后计算这些数据组的平均值。如果应用这些步骤,将得到结果41.7273, 25.7273, 66.4545。

注意:为了清楚起见,输入值的数量和输出值的数量必须是伪素数。否则,它只会重复输入值,结果将与(双)线性方法相同。

实现

以下是适应2D点数组的实现代码。

type TPointArr = array of TPoint ; .... procedure SmartDecimation(source: TPointArr; mSource: integer ; var dest: TPointArr; nDest: integer); // (c) Copyright AG 2021. ademgunes@yahoo.com // Not allowed to use for commercial apps without permissions. var m, n, k, p, q: integer ; t1, t2: double ; begin if ( (mSource < 3) or (nDest < 3) ) then Exit ; t1 := 0 ; t2 := 0 ; for m:=0 to mSource- 1 do begin for n:=0 to nDest- 1 do begin k := m * nDest + n; t1 := t1 + source[m].X; t2 := t2 + source[m].Y; p := k div mSource; q := k mod mSource; if (q = mSource-1) then begin dest[p].X := trunc(t1 / mSource + 0 .5); dest[p].Y := trunc(t2 / mSource + 0 .5); t1 := 0 ; t2 := 0 ; end ; end ; end ; end ;

使用代码

该算法已实现为一个过程SmartDecimation。它接受一个点的输入数组和输入点的数量(M),以及一个输出点的数组和输出点的数量(N)。因此,它执行M/N重采样。在使用该过程之前,必须初始化所有参数。

示例和比较

以下是一些示例和结果:

  • 原始
  • 智能降采样(自动模式)
  • 智能降采样(手动模式)
  • Douglas-Peucker
  • 原始图像
  • 使用SID调整大小的图像
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485