在信号处理和图像处理领域,曲线简化是一个重要的研究课题。本文提出了一种名为“智能降采样”的新方法,旨在通过不同的技术手段实现曲线的简化和平滑。众所周知,通过添加零或移除相同样本,可以使用FFT进行多速率重采样来获取简化的曲线。本文将总结一些已知的简化算法,如Douglas-Peucker算法、Visvalingam-Whyatt算法、基于曲率的简化算法、最大平方距离算法、Reumann-Witkam算法、Opheim算法、Lang算法以及Nth点算法等。
在继续之前,强烈推荐阅读CodeProject上Elmar de Koning撰写的“Polyline Simplification”文章。
假设有3个点,想要得到5个点(即插值),或者有5个点,想要得到3个点(即降采样)。这种方法可以用于这两种情况。在这里,将其用于降采样。这种方法实际上与双线性插值非常相似,但在所有方面都有很大的不同。知道,在图像处理中,有一些著名的算法用于图像大小调整:
从视觉上看,算法的质量比双线性好,但比双三次差。在放大时,它比其他方法有更少或没有伪影(即混叠、模糊、边缘光晕)。
解释底层逻辑的最好方法是使用逐步插图。
例如,假设有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重采样。在使用该过程之前,必须初始化所有参数。
以下是一些示例和结果: