2

我正在编写一个解压缩器,它(除其他外)必须将增量过滤器应用于 RGB 图像。也就是说,读取的图像只有第一个像素是绝对的(R1,G1,B1),其他的都是(R[n]-R[n-1],G[n]-G[n-1) ], B[n]-B[n-1]),并将它们转换为标准 RGB。

现在我使用 numpy 如下:

rgb = numpy.fromstring(data, 'uint8')
components = rgb.reshape(3, -1, order='F')
filtered = numpy.cumsum(components, dtype='uint8', axis=1)
frame = numpy.reshape(filtered, -1, order='F')

在哪里

  • 第 1 行创建原始图像的一维数组;
  • 第 2 行将其重塑为形式

    [[R1, R2, ..., Rn], [G1, G2, ..., Gn], [B1, B2, ..., Bn]]
    
  • 第 3 行执行实际的去过滤

  • 第 4 行再次转换回一维数组

问题是它对我的需求来说太慢了。我对其进行了分析,发现大量时间用于重塑阵列。

所以我想知道:有什么方法可以避免重塑或加快它的速度吗?

笔记:

  • 我宁愿不必为此编写 C 扩展。
  • 我已经在使用多线程了
4

2 回答 2

2

由于某种原因我还不明白,您代码中的最终重塑复制了数据。这可以通过使用 C 顺序而不是 Fortran 顺序来避免:

rgb = numpy.fromstring(data, 'uint8')
components = rgb.reshape(-1, 3)
filtered = numpy.cumsum(components, dtype='uint8', axis=0)
frame = filtered.reshape(-1)
于 2012-02-08T19:55:32.993 回答
1

首先,当你阅读它时,你可以告诉它更多关于类型的信息,试试:

rgb = numpy.fromstring(data, '3uint8')

无需重塑。

接下来,对于大型操作,您可以摆脱它(并且cumsum有资格),使用out=参数来防止移动数据......一切都发生在适当的位置。利用:

rgb.cumsum(axis=0,out=rgb)

如果您仍然希望它变平:

rgb = rgb.ravel()
于 2012-02-08T20:19:18.633 回答