双线性插值 - OSRM Rastersource
Bilinear Interpolation - OSRM Rastersource
我对 OSRM 项目中的双线性插值有疑问。
我了解 "normal" 双线性插值。这里是维基百科的图片,什么是疯狂的:
现在我正在尝试了解 OSRM 项目中用于栅格源数据的双线性插值。
// Query raster source using bilinear interpolation
RasterDatum RasterSource::GetRasterInterpolate(const int lon, const int lat) const
{
if (lon < xmin || lon > xmax || lat < ymin || lat > ymax)
{
return {};
}
const auto xthP = (lon - xmin) / xstep;
const auto ythP =
(ymax - lat) /
ystep; // the raster texture uses a different coordinate system with y pointing downwards
const std::size_t top = static_cast<std::size_t>(fmax(floor(ythP), 0));
const std::size_t bottom = static_cast<std::size_t>(fmin(ceil(ythP), height - 1));
const std::size_t left = static_cast<std::size_t>(fmax(floor(xthP), 0));
const std::size_t right = static_cast<std::size_t>(fmin(ceil(xthP), width - 1));
// Calculate distances from corners for bilinear interpolation
const float fromLeft = xthP - left; // this is the fraction part of xthP
const float fromTop = ythP - top; // this is the fraction part of ythP
const float fromRight = 1 - fromLeft;
const float fromBottom = 1 - fromTop;
return {static_cast<std::int32_t>(raster_data(left, top) * (fromRight * fromBottom) +
raster_data(right, top) * (fromLeft * fromBottom) +
raster_data(left, bottom) * (fromRight * fromTop) +
raster_data(right, bottom) * (fromLeft * fromTop))};
}
有人可以向我解释代码的工作原理吗?
输入格式为ASCII格式的SRTM数据。
变量height和width定义为nrows和 n 列 。
变量 xstep 和 ystep 定义为:
return (max - min) / (static_cast<float>(count) - 1)
对于 ystep 和 width[=,count 是 height 47=]对于xstep、max和min相似。
还有一个问题:
我可以对 TIF 格式 和整个世界的数据使用相同的代码吗?
水平像素坐标在[0, width - 1]
范围内;同样垂直坐标在[0, height - 1]
。 (零索引约定在包括 C++ 在内的许多语言中使用)
线条
const auto xthP = (lon - xmin) / xstep;
(以及 ythP
)
将输入图像-space坐标(long, lat)
转换为像素坐标。 xstep
是image-space.
中每个像素的宽度
向下舍入(使用 floor
)得到一侧与样本区域相交的像素,向上舍入(ceil
)得到另一侧的像素。对于 X 坐标,这些给出 left
和 right
.
之所以使用fmin
和fmax
是为了钳制坐标不超出像素坐标范围
编辑:由于您正在尝试解释这张图片,因此我将在下面列出相应的部分:
Q11
= (left, top)
Q12
- (left, bottom)
, 等等
P
= (xthP, ythP)
R1
= fromTop
, R2
= fromBottom
等等
一个好的起点是 http://www.cs.uu.nl/docs/vakken/gr/2011/Slides/06-texturing.pdf,幻灯片 27。但在未来,Google 是你的朋友。
我对 OSRM 项目中的双线性插值有疑问。 我了解 "normal" 双线性插值。这里是维基百科的图片,什么是疯狂的:
现在我正在尝试了解 OSRM 项目中用于栅格源数据的双线性插值。
// Query raster source using bilinear interpolation
RasterDatum RasterSource::GetRasterInterpolate(const int lon, const int lat) const
{
if (lon < xmin || lon > xmax || lat < ymin || lat > ymax)
{
return {};
}
const auto xthP = (lon - xmin) / xstep;
const auto ythP =
(ymax - lat) /
ystep; // the raster texture uses a different coordinate system with y pointing downwards
const std::size_t top = static_cast<std::size_t>(fmax(floor(ythP), 0));
const std::size_t bottom = static_cast<std::size_t>(fmin(ceil(ythP), height - 1));
const std::size_t left = static_cast<std::size_t>(fmax(floor(xthP), 0));
const std::size_t right = static_cast<std::size_t>(fmin(ceil(xthP), width - 1));
// Calculate distances from corners for bilinear interpolation
const float fromLeft = xthP - left; // this is the fraction part of xthP
const float fromTop = ythP - top; // this is the fraction part of ythP
const float fromRight = 1 - fromLeft;
const float fromBottom = 1 - fromTop;
return {static_cast<std::int32_t>(raster_data(left, top) * (fromRight * fromBottom) +
raster_data(right, top) * (fromLeft * fromBottom) +
raster_data(left, bottom) * (fromRight * fromTop) +
raster_data(right, bottom) * (fromLeft * fromTop))};
}
有人可以向我解释代码的工作原理吗?
输入格式为ASCII格式的SRTM数据。
变量height和width定义为nrows和 n 列 。 变量 xstep 和 ystep 定义为:
return (max - min) / (static_cast<float>(count) - 1)
对于 ystep 和 width[=,count 是 height 47=]对于xstep、max和min相似。
还有一个问题: 我可以对 TIF 格式 和整个世界的数据使用相同的代码吗?
水平像素坐标在[0, width - 1]
范围内;同样垂直坐标在[0, height - 1]
。 (零索引约定在包括 C++ 在内的许多语言中使用)
线条
const auto xthP = (lon - xmin) / xstep;
(以及 ythP
)
将输入图像-space坐标(long, lat)
转换为像素坐标。 xstep
是image-space.
向下舍入(使用 floor
)得到一侧与样本区域相交的像素,向上舍入(ceil
)得到另一侧的像素。对于 X 坐标,这些给出 left
和 right
.
之所以使用fmin
和fmax
是为了钳制坐标不超出像素坐标范围
编辑:由于您正在尝试解释这张图片,因此我将在下面列出相应的部分:
Q11
=(left, top)
Q12
-(left, bottom)
, 等等P
=(xthP, ythP)
R1
=fromTop
,R2
=fromBottom
等等
一个好的起点是 http://www.cs.uu.nl/docs/vakken/gr/2011/Slides/06-texturing.pdf,幻灯片 27。但在未来,Google 是你的朋友。