Skip to main content
 首页 » 编程设计

python之在 python 中解码 RGB 图像的快速方法

2025年05月04日14zdz8207

我有一个尺寸为 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 

在本质上还有更多相似的方法。查看这篇文章的评论,了解一组不错的单行本。