2013-12-20 7 views
2

У меня есть 3D-массив (х, у, RGBA) и моя цель:NumPy условно заменить скалярные/булеву с массивом

найти какие пиксели являются пустым RGBA = [0,0,0,0], то изменение их цвет - синий, а для других пикселей цвет меняется на зеленый.

Насколько я вижу это может быть сделано в 2 этапа:

1- создать 500x500 массив BOOL Истинного, если пиксель имеет значение, и False, если пустой

2- затем применить функцию замените True на [0,0,255,255] и False на [0,255,0, 255]

после многочисленных поисков (я не мастер python) Мне удалось достичь 1- в питоническом (по крайней мере, надежда). ..)

img.shape 
>(500, 500, 4) 
img_bool = np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2) 
img_bool.shape 
>(500, 500) 

мое предположение на шаге 2 пытается такой синтаксис:

img_final = np.where(img_bool, [0,0,255,255], [0,255,0,255]) 

или

np.choose(img_bool, [[0,0,255,255],[0,255,0,255], out=img_final) 

но они дают ту же ошибку (вполне логично, поскольку оба выражения могли бы сделать то же самое на самом деле)

ValueError: shape mismatch: objects cannot be breascast to a single shape

Фактически, шаг 2 может быть выражен «заменой скалярного/булевого на массив/вектор в numpy.ndarray?»

ответ

1

Для вашей первой задачи, используя тот факт, что цвета являются положительными целыми числами, вы можете использовать

img_bool = img.sum(axis=2)>0 

вторых вы можете сделать с

img[img_bool] = [0, 0, 255, 255] 
img[~img_bool] = [0, 255, 0, 255] 

Обратите внимание, что если я получу ваше описание права , вы будете возвращать исходное выражение, т. е. вы должны изменить его на

img_bool = ~np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2) 
+0

очень аккуратный синтаксис. thx, все ваши ответы работают отлично. просто одно замечание: img.sum (axis = 2)> 0 может возвращать True, если массив пикселей был [0, -15, 15, 0] нет? но в моем случае он отлично работает, поскольку все значения являются положительными. thx снова. – comte

+0

@comte да, может, я добавил разъяснения. Я оценил по значениям, равным 255, чтобы ваши цвета были позитивными. – alko

Смежные вопросы