2015-03-06 2 views
2

Обратите внимание, что я прочитал ответы на вопросы одной и той же проблемы, но никто не похож на мой.ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте a.any() или a.all()

Я загрузил изображение в OpenCV и отобразил его. Все отлично.

Теперь я хочу, чтобы установить черные пиксели на синий, так что я запускаю это:

for i in range(image.shape[0]): 
    for j in range(image.shape[1]): 
     if image[i,j,0]==0 and image[i,j,1]==0 and image[i,j,2]==0: 
      image[i,j,0]=255 

Я получил эту ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Nota Bene:

  • Обозначения image[i,j,0], image[i,j,1] и image[i,j,2] подчеркнуть значение канала пикселя (BGR = Blue Green Red), поэтому это не массив, как это сообщение об ошибке. Настолько странно, если Python не понимает самого себя.

  • Когда я бегу print image[i,j,x] с x = 0,1,2 я получаю нормальное поведение для случайных величин i и j. То есть, я правильно получаю значения этих трех каналов.

+0

Попробуйте заменить проверку состояния следующим образом: 'if (image [i, j, 0] == 0) & (image [i, j, 0] == 0) & (image [i, j, 0] == 0): 'Я думаю, что проблема заключается в том, что при сравнении массивов вам нужно использовать побитовые операторы, а также использовать скобки из-за оператора. Endecnce – EdChum

+0

Чтобы дать некоторый контекст в ответе Edchum: http://stackoverflow.com/questions/10062954/valueerror-the-truth-value-of-a-array-with-more-than-one-element-is-ambiguous –

+0

@EdChum Я сделал то, что вы сказали, но поверьте мне, это говорит мне точно так же сообщение об ошибке –

ответ

1

Попробуйте это:

import numpy as np 

image[np.all(image == 0, axis=-1)] = [255, 0, 0] 

Здесь вы проверяете только оси Z с помощью NumPy операций, и заменить его с синим, для которых пиксельные каналов равны 0. Это бесконечность быстрее (в наименее для больших изображений), а также менее коварный.

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

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