Ошибка значения: Значение истинности массива, содержащего более одного элемента, неоднозначно. Используйте.any() или. all(). Как им пользоваться?

#python #image #numpy #image-processing

Вопрос:

Я пытался нарезать серым ровным слоем.

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

 def without_background(img_path, save_path):
    image = Image.open(img_path)
    img_array = np.array(image,dtype=np.uint8)
    img_shape=(image.width,image.height)
    display(image)
    
    for i in range(img_shape[1]):
        for j in range(img_shape[0]):
            v = img_array[i][j]
            if(v>=0 and v<=50):
                print(img_array[i][j]
                img_array[i][j]=255
            else:
                img_array[i][j]=0

    resultImage = Image.fromarray(img_array)
    resultImage.save(save_path)
    display(resultImage)
 

Это ошибка:

 ValueError                                Traceback (most recent call last)
<ipython-input-23-a6d36de00a06> in <module>()
      2         for j in range(img_shape[0]):
      3             v = img_array[i][j]
----> 4             if(v>=0 and v<=50):
      5               print(img_array[i][j])

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

Комментарии:

1. v представляет собой массив. Значение истинности массива неоднозначно.

2. Пожалуйста, добавьте фрагмент кода, который действительно читает изображение (создает img_array ), к вашему вопросу

Ответ №1:

Изображения есть three dimensions . посмотрите на этот пример, вы знаете, где вы ошибаетесь. если вы хотите проверить v , вам нужно повторить v , как показано ниже:

 from PIL import Image

image = Image.open('1.png')
img_array = np.array(image,dtype=np.uint8)
print(img_array.shape) # (820, 892, 4)


img_shape=(image.width,image.height)
for i in range(img_shape[1]):
    for j in range(img_shape[0]):
        v = img_array[i][j]
        print(type(v.shape)) # <class 'tuple'>
        for k in v: # add this line
            if (k>=0 and k<=50):
                print(img_array[i][j])
                img_array[i][j]=255
            else:
                img_array[i][j]=0
 

Ответ №2:

В вашем примере img_array[i][j] возвращает np.array значение (а не только одно значение), потому что оно возвращает значения RGB пикселя.

Если ваше изображение уже в оттенках серого и все 3 значения идентичны, вы можете просто взять, например, первое (красное), как это:

 v = img_array[i][j][0]
 

Если ваше изображение еще не в оттенках серого, вы, вероятно, захотите взять среднее значение для каждого значения:

 v = img_array[i][j].mean()
 

… или, возможно, сделать на нем более сложную математику.

Что на самом деле означает ошибка

Давайте возьмем этот небольшой пример:

 >>> arr = np.array(range(4))
>>> arr
array([0, 1, 2, 3])
>>> arr > 1
array([False, False, True,  True])
 

То, что мы получаем в результате этого сравнения, — это не просто одно логическое значение, а совершенно новое np.array , заполненное результатом каждого отдельного сравнения. В основном расширяется вот так:

 [0 > 1, 1 > 1, 2 > 1, 3 > 1]
 

Когда вы сейчас попытаетесь преобразовать это np.array в одно логическое значение…

 >>> if arr > 1: # which basically does: bool(arr > 1)
...   pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
 

… вы получаете именно эту ошибку.

У вас есть два варианта, которые любезно предоставляет вам сообщение об ошибке:

  1. Используйте (arr > 1).all() значение true, если все значения больше 1.
  2. Используйте (arr > 1).any() значение true, если какое-либо значение больше 1.