距离及其近似计算
1.导读
本文简要推导在一些需要计算距离,计算资源又不提供开平方运算的情况下,如何逼近常用的欧式距离?
在泛函分析中,距离通常由范数诱导,因此在信号处理中常用的距离为基于LpLp范数的距离,这里给出LpLp范数的定义。
通常的欧式距离,即为取p=2p=2的一个特例
在ISP的pipeline或者其他通过ASIC逻辑电路来计算距离的计算系统中,开方运算功耗较大,需要较大的面积,因此常常采用基于L1L1范数的距离度量,也即棋盘距离:
对于lens shading correction或者沿径向去噪等对距离要求较高应用,需要对欧式距离有一个很高精度的逼近,因此需要考虑对欧式距离进一步逼近。
2.具体内容
这里提供两种对欧式距离逼近的策略。
2.1 采用两个正方形及其旋转组合成的八边形逼近
八边形示意图如下:
原理与解释:
推导过程:
如上图所示:八边形分为蓝色和红色部分,以第一象限为例:蓝色部分点在直线|x|+|y|=2–√l|x|+|y|=2l,蓝色部分到八边形中心的距离为:
红色部分:
要使红色部分到中心的距离和蓝色部分到中心的距离相等
从而八边形距离公式如本部分开始所述。
示例代码(MATLAB)
function d = L2_distance_oct(x1, y1, x2, y2)
dx_abs = abs(x1 - x2);
dy_abs = abs(y1 - y2);
if ( dx_abs > dy_abs * tand(22.5) ) && ( dy_abs > dx_abs * tand(22.5) )
d = dx_abs + dy_abs;
else
d = sqrt(2) * max(dx_abs, dy_abs);
end
end
2.2 斜面距离逼近
斜面距离示意图如下:
原理与解释:
斜面距离是对邻域中欧式距离的整数近似。从像素pp到其4-邻域的像素只需要水平移动或者垂直移动(称为a-move)。因为所有移动根据对称或旋转都是相等的,对离散距离的唯一可能的定义就是距离,其中a=1a=1。从像素pp到其8-邻域的像素不仅有水平移动或垂直移动,还有对角移移动(称为b-move)。同时考虑这两种移动,可把斜面距离记为。最自然的bb值为,但是为了计算的简单和减少存储量,将aa值和值都取整数。最常用的一组值是a=3a=3和b=4b=4。这组值可如下获得。考虑像素p1p1和p2p2之间在水平方向相差的像素个数为nxnx,在垂直方向相差像素个数为nyny(不失一般性,设nx>nynx>ny),则像素p1p1和p2p2之间的斜面距离为
它与欧式距离之差为:
如果取a=1a=1,b=2–√b=2,将ΔD(p1,p2)ΔD(p1,p2)对nyny求导数得
令导数为零,计算ΔD(p1,p2)ΔD(p1,p2)的极值可得
即两距离之差ΔD(p1,p2)ΔD(p1,p2)在满足上式时区最大值((2–√−1)/2−−−−−−−−−√−1)nx≈−0.09nx((2−1)/2−1)nx≈−0.09nx(此时直线与横轴间夹角为24.5∘24.5∘)。进一步可证明当b=1/21/2+(21/2−1)=1.351b=1/21/2+(21/2−1)=1.351时ΔD(p1,p2)ΔD(p1,p2)的最大值可达到最小。因为4/3≈1.334/3≈1.33,随意斜面距离取a=3a=3和b=4b=4
此时斜面距离的计算公式为:
示例代码(MATLAB)
function d = L2_distance_slope(x1, y1, x2, y2)
dx_abs = abs(x1 - x2);
dy_abs = abs(y1 - y2);
if dx_abs > dy_abs
d = (dx_abs - dy_abs) * 3 + 4 * dy_abs;
else
d = (dy_abs - dx_abs) * 3 + 4 * dx_abs;
end
end
综上,本文提供了两种对L1L1的距离的菱形区域的改进方案,为需要对图像沿半径进行区域划分提供了不同的选择,根据计算资源选择对应的方案。
参考文献:
1.图像工程(中册),第三版,p10