Как вы уже пишете в комментариях, проблема заключается в следующей строке:
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.tile
в качестве замены repmat()
.На самом деле вы хотите вызвать np.tile
с (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