正如您已经在评论中所写,问题在于以下几行:
maskedRGBImage[(np.array([np.tile(~BW, (1,1)) for i in range(3)]))] = 0
首先,请注意
np.tile(~BW, (1, 1))
什么都不做:
np.tile
是MATLAB的等价物
repmat()
,它会按指定的次数重复矩阵,即仅重复一次。你回来了
~BW
.你可以打电话确认
np.all(np.tile(~BW, (1, 1)) == ~BW)
它回来了
True
,表明这真的等于
~BW
.
其次,手动尝试重新创建
repmat()
列表理解功能:
np.array([np.tile(~BW, (1,1)) for i in range(3)])
但是,请注意,这将返回一个大小为
(3, 1024, 768)
,而您的图像具有
(1024, 768, 3)
.这实际上是错误消息所说的。
一个可能的解决方案是,删除列表并使用
NP瓦片
作为一个
repmat()
替换你真的想打电话吗
NP瓦片
具有
(1, 1, 3)
作为参数,将输入数组在三维中平铺三次。
而在MATLAB中,这是开箱即用的,NumPy要求您制作输入数组
BW
在你的情况下是三维的,也就是说,将其从三维改为三维
(1024, 768)
到
(1024, 768, 1)
.这是通过使用
np.newaxis
:
np.tile(~BW[:, :, np.newaxis], (1, 1, 3))
有了这个索引
maskedRGBImage
变量应该可以正常工作:
maskedRGBImage[np.tile(~BW[:, :, np.newaxis], (1, 1, 3))] = 0