在GIS和图像处理中插值算法很常用,散点状的数据面状化。
常用的插值方法包括:反距离权重插值法(IDW)、克里金插值法(Kriging)、双线性插值法等。
反距离权重插值法
反距离加权插值,(Inverse Distance Weight) ,也可以称为距离倒数乘方法。是指距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。
ArcGIS的解释:
反距离权重 (IDW) 插值显式假设:彼此距离较近的事物要比彼此距离较远的事物更相似。当为任何未测量的位置预测值时,反距离权重法会采用预测位置周围的测量值。与距离预测位置较远的测量值相比,距离预测位置最近的测量值对预测值的影响更大。反距离权重法假定每个测量点都有一种局部影响,而这种影响会随着距离的增大而减小。由于这种方法为距离预测位置最近的点分配的权重较大,而权重却作为距离的函数而减小,因此称之为反距离权重法。
核心概念就是,随着距离增大,预测点的值受到离散点的影响变小,也就是权重变小,如图所示
权重与反距离(数据点与预测位置之间)的 p 次幂成正比。因此,随着距离的增加,权重将迅速降低。权重下降的速度取决于 p 值。如果 p = 0,则表示权重不随距离减小,且因每个权重 λi 的值均相同,预测值将是搜索邻域内的所有数据值的平均值。随着 p 值的增大,较远数据点的权重将迅速减小。如果 p 值极大,则仅最邻近的数据点会对预测产生影响。
示例
最上面的图即为效果图
核心代码:
//随机生成数据
function randomPoint() {
for (let i = 0; i < 10; i++) {
var x = rn(width);
var y = rn(height);
var z = rn(255);
datas.push([x, y, z]);
}
}
//遍历像素点计算预测值
function interpolateGrid(id) {
for (let i = 0; i < width; i++) {
for (let j = 0; j < height; j++) {
var v = idw(i, j);
createPixel(id, i, j, v);
}
}
}
//遍历离散点计算权重得出预测值
function idw(x, y) {
var sw = 0, zw = 0;
datas.forEach(data => {
var dx = data[0] - x;
var dy = data[1] - y;
var distance = Math.sqrt(dx * dx + dy * dy)
var zValue = data[2];
var w = 1.0 / Math.pow(distance, 2);
sw += w;
zw += w * zValue;
})
return zw / sw;
}