我有一个尺寸为 1024x1024 的 PNG 图像,其中包含 RGB 编码的高程数据。 我使用 numpy 中的 asarray 读取图像:
rgb_data = np.asarray(image)
这会生成维度为 (1024, 1024, 4) 的 3D 数组。 (我正在使用 RGBA)
我需要对该数据运行一些过滤器(高斯、中值),但我需要在解码的高程数据上运行它。
可以使用以下函数对高程数据进行解码:
def decodeRGB(pixel):
return (pixel[0] * 256 + pixel[1] + pixel[2] / 256) - 32768
解码后,我将得到一个维度为 (1024, 1024) 的二维数组,其中包含解码后的高程数据。 (实际海拔高度)
我目前的情况是这样的:
rgb_data = np.asarray(image)
decoded_data = np.zeros(tile.size)
for rownum in range(width):
for colnum in range(height):
decoded_data[rownum][colnum] = decodeRGB(rgb_data[rownum][colnum])
不幸的是,这个解决方案非常慢。大约需要1024 x 1024 图像需要 10 秒。
有没有更高效的方法来实现它?
我的主要问题是数组的维度发生了变化。 我将从 (1024, 1024, 4) 数组转到 (1024, 1024) 数组。
我基本上是在寻找一种快速/高效的方法来将函数应用于图像中的每个 RGB 像素,从而减少数组大小。
非常感谢您的帮助!
请您参考如下方法:
利用矢量化:
r = rgb_data[..., 0]
g = rgb_data[..., 1]
b = rgb_data[..., 2]
decoded_data = (256*r + g + b/256) - 32768
例如 rgb_data[..., 0] 一次选择所有 1024x1024 红色值,256*r 一次将它们全部乘以 256,依此类推。由于代码中解释的 for 循环会带来巨大的开销,因此避免它们应该会大大加快转换速度。
或者您可以使用单线:
decoded_data = (rgb_data[..., :3] * (256, 1, 1/256)).sum(axis=-1) - 32768
在本质上还有更多相似的方法。查看这篇文章的评论,了解一组不错的单行本。
