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

python中RGB图像的快速解码方法,python,arrays,performance,numpy,image-processing,Python,Arrays,Performance,Numpy,Image Processing,我有一个尺寸为1024x1024的PNG图像,其中包含RGB编码的高程数据。 我从numpy使用asarray读取图像: 这将生成一个维度为1024、1024、4的三维数组。我用的是RGBA 我需要在数据上运行一些高斯中值滤波器,但我需要在解码的高程数据上运行它 高程数据可通过以下功能进行解码: def decodeRGB(pixel): return (pixel[0] * 256 + pixel[1] + pixel[2] / 256) - 32768 解码后,我将有一个尺寸为10

我有一个尺寸为1024x1024的PNG图像,其中包含RGB编码的高程数据。 我从numpy使用asarray读取图像:

这将生成一个维度为1024、1024、4的三维数组。我用的是RGBA

我需要在数据上运行一些高斯中值滤波器,但我需要在解码的高程数据上运行它

高程数据可通过以下功能进行解码:

def decodeRGB(pixel):
    return (pixel[0] * 256 + pixel[1] + pixel[2] / 256) - 32768
解码后,我将有一个尺寸为10241024的2D数组,其中包含解码后的高程数据。海平面以上的实际高度

到目前为止,我得到的是:

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秒钟

有没有更有效的方法来实现这一点

我的主要问题是数组的维度发生了变化。 我将从102410244数组变成10241024数组

我基本上在寻找一种快速有效的方法,将函数应用于图像中的每个RGB像素,从而减少阵列大小


非常感谢你的帮助

利用矢量化:

r = rgb_data[..., 0]
g = rgb_data[..., 1]
b = rgb_data[..., 2]
decoded_data = (256*r + g + b/256) - 32768
例如,rgb_数据[…,0]一次选择所有1024x1024个红色值,256*r一次将所有值乘以256,以此类推。由于代码中的解释for循环带来了巨大的开销,因此避免它们应该会大大加快转换速度

或者您可以使用一个衬里:

decoded_data = (rgb_data[..., :3] * (256, 1, 1/256)).sum(axis=-1) - 32768

还有更多精神上相似的方式。查看这篇文章上的评论,可以找到一个很好的一行程序集。

利用矢量化:

r = rgb_data[..., 0]
g = rgb_data[..., 1]
b = rgb_data[..., 2]
decoded_data = (256*r + g + b/256) - 32768
例如,rgb_数据[…,0]一次选择所有1024x1024个红色值,256*r一次将所有值乘以256,以此类推。由于代码中的解释for循环带来了巨大的开销,因此避免它们应该会大大加快转换速度

或者您可以使用一个衬里:

decoded_data = (rgb_data[..., :3] * (256, 1, 1/256)).sum(axis=-1) - 32768

还有更多精神上相似的方式。查看这篇文章上的评论,可以找到一个很好的一行程序集。

您可以使用非常强大的np.einsum对流程进行矢量化。只要用你的系数做一个变换向量

def decodeRGBArray(rgb_data):
    transf = np.array([256., 1., 1./256., 0.])
    return np.einsum('ijk,k->ij', rgb_data, transf) - 32768

您可以使用非常强大的np.einsum对流程进行矢量化。只要用你的系数做一个变换向量

def decodeRGBArray(rgb_data):
    transf = np.array([256., 1., 1./256., 0.])
    return np.einsum('ijk,k->ij', rgb_data, transf) - 32768

Python不是读取、计算图像像素数据的好选择。获得一门低级语言@dsgdfg当然,纯Python并不以其速度著称,但这就是Numpy受欢迎的原因:它可以使用编译后的代码对机器本机数据的多维数组进行操作,因此算术和循环以编译后的速度进行,不是在虚拟机上操纵Python对象的Python字节码的缓慢速度下。64位机器ram地址+虚拟ram地址+主线程ram地址+子线程ram地址可能在@Sandro项目上工作,但并非总是如此。。将ram地址保存到ram中,为什么更多制造商生产PCI卡计算器模块?Python不是读取、计算图像像素数据的好选择。获得一门低级语言@dsgdfg当然,纯Python并不以其速度著称,但这就是Numpy受欢迎的原因:它可以使用编译后的代码对机器本机数据的多维数组进行操作,因此算术和循环以编译后的速度进行,不是在虚拟机上操纵Python对象的Python字节码的缓慢速度下。64位机器ram地址+虚拟ram地址+主线程ram地址+子线程ram地址可能在@Sandro项目上工作,但并非总是如此。。将ram地址保存到ram中,为什么更多制造商生产PCI卡计算器模块?甚至只是rgb_数据@[256,1,1/256,0]-32768@Eric:-但是把所有这些零相乘和相加是一种浪费。还是很漂亮!然后使用rgb_数据[…,:3]@[256,1,1/256]-32768。使用的内存应该比构建整个过程要少summing@Eric一件艺术品。介意我把它添加到帖子中吗?@Eric@operator是最近才添加的。对于python版本<3.5,相应的方法是rgb_数据[…,:3].dot[256,1,1/256]-32768,甚至只是rgb_数据@[256,1,1/256,0]-32768@Eric:-但是把所有这些零相乘和相加是一种浪费。还是很漂亮!然后使用rgb_数据[…,:3]@[256,1,1/256]-32768。使用的内存应该比构建整个过程要少summing@Eric一件艺术品。介意我把它添加到帖子中吗?@Eric@operator是最近才添加的。对于python版本<3.5,相应的方法是rgb_数据[…,:3].dot[256,1,1/256]-32768