如何从 rgb 地图构建海拔比例?

Posted

技术标签:

【中文标题】如何从 rgb 地图构建海拔比例?【英文标题】:How to build an elevation scale from an rgb map? 【发布时间】:2020-05-26 11:01:03 【问题描述】:

对于一个挑战,我需要建立一个颜色和高度之间的对应图(见下图)。 海拔文件有蓝色的海,绿色/黄色/棕色的海拔。 挑战给出的建议是:找到勃朗峰的像素(4810 m)

我正在使用 python。 我完全不知道如何解决这个问题。我已将地图转换为具有 RGB 值的 numpy 形状数组 (2860,4490,3),我想将此数组转换为 (2860,4490) 以米为单位的高程值。如果您有任何建议或意见,我会非常喜欢它!

【问题讨论】:

没有任何适当的刻度,你希望它如何转换为米? 我相信你已经得到了至少 1 个已知高度和颜色的点。 您是如何“将地图转换为 numpy 数组”的?该图像的raster versions 是 2208 x 1971 像素,这甚至与您的阵列的纵横比不同。最不常见的颜色出现在约 6500 像素中,散布在阿尔卑斯山和其他地方 这不是我使用的确切图像,但完全相似 【参考方案1】:

这里最低(min_value)的RGB颜色为蓝色,最高(max_value)为棕色。 如果我们采用所有可能的不同颜色并使用 R、G、B 作为特征,我们应该将它们投影到 1D 空间中。

所以如果将R、G、B视为X、Y、Z 3D空间,则在Blue min_value (x1, y1, z1)和Brown max_value (x2, y2,z2)之间存在一条直线

您可以将 x1 y1, z1 设为 0, 0, 0 并转换 (x2,y2,z2) -> (x2-x1, y2-y1, z2-z1) 这将为您提供更简单的线性映射,您可以使用它映射到任何中间点 (x3,y3,z3),前提是您知道该点距海平面的高度。如此获得的 (x3,y3,z3) 点只不过是 R=x3、G=y3 和 B=z3 的 RGB 颜色 该颜色的像素位置就是您的答案!

【讨论】:

我不明白你的意思?我有每个像素的所有 rgb 值。我知道蓝色的转换为 0,棕色的转换为 4810。但是我应该如何将其余的值从 3D 转换为 1D?【参考方案2】:

如果同班的另一个学生偶然发现了这个问题。关键字是色彩空间 HSV。将 RGB 图像转换为 HSV 空间,并看到使用“色调”可以线性映射陆地。分开处理水。

有用的资源:

在此处阅读幻灯片 13:http://www.inf.ed.ac.uk/teaching/courses/vis/lecture_notes/lecture5-2x2.pdf 这里的最后一个答案给出了更多的直觉:https://forum.image.sc/t/topography-calibrated-from-color-scale/2363/2 最后,您可以使用 scikit 图像进行处理:
from skimage.color import rgb2hsv

rgb_img = np.array(your_image)

hsv_img = rgb2hsv(rgb_img)
hue_img = hsv_img[:, :, 0]

取自:https://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_rgb_to_hsv.html

【讨论】:

好答案;感谢您花时间添加资源。 (顺便说一句,matplotlib 中也有matplotlib.colors.rgb_to_hsv。)

以上是关于如何从 rgb 地图构建海拔比例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改用户设置的缩放比例的情况下更新地图标记?

使用Leaflet地图上比例尺的值

如何在 matplotlib 的地图中插入比例尺

supermap如何修改自带的缩放等级

如何从 HealthKit 跑步锻炼中获取海拔增益、节奏和跑步速度?

如何从 HealthKit 跑步锻炼中获取海拔增益、节奏和跑步速度?