如何将1通道numpy矩阵转换为4通道单色图像

时间:2016-09-02 12:26:04

标签: python numpy pyqt4

我正在使用numpy和cv2进行pyqt项目。基本上,我想使用二进制numpy掩码(1024, 1024)来创建一个4通道单色图像(1024, 1024, 4),其中掩码中的所有1都是粉红色而所有0都是不可见的。然后我转换图像并在我的QScene中将其显示为叠加,以突出显示另一个图像中的一些像素。

我目前的方法完成了这项工作,但速度太慢,我确信numpy提供了更方便的东西。

color = (255, 0, 238, 100)
r = (mask * color[0]).reshape((w*h))
g = (mask * color[1]).reshape((w*h))
b = (mask * color[2]).reshape((w*h))
a = (mask * color[3]).reshape((w*h))

rgba = np.dstack((r, g, b, a)).reshape((w, h, 4))
transposed = np.transpose(rgba, axes=[1, 0, 2])

有更好的方法来显示遮罩叠加层吗?我并不坚持使用numpy,但是,重要的是我可以设置颜色,因为我需要多种颜色。

1 个答案:

答案 0 :(得分:3)

是的!使用documentation进行清理并设置transposed = mask.T[...,None]*color ,就像这样 -

mask.T

<强>解释

  1. 使用np.transpose执行最后完成的[...,None]操作。
  2. 在转置数组上使用length=1基本上将其所有尺寸都推到前面,并创建一个单身昏暗(dim with None)作为最后一个轴。为了引入这个新轴,我们使用了NumPy broadcasting - color的别名。因此,我们将实现转置数组沿着与broadcasted元素对齐的最后一个轴的广播。
  3. 最后,我们执行逐元素乘法本身,实际上它将是一个np.transpose操作。
  4. 您可以在开始时执行新轴部件的创建,然后使用np.swapaxestransposed = mask[:,:,None].transpose(1,0,2)*color ,这将更接近原始代码。所以,或者我们可以:

    transposed = mask[:,:,None].swapaxes(0,1)*color
    

    和,

    {{1}}