Значение истинности массива с более чем одним элементом является неоднозначной ошибкой Python - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно определить, является ли изображение пицизированным или нет. Поэтому я использую код Python, который был взят из другого сообщения stackoverflow:

import numpy as np
from PIL import Image, ImageChops

im = Image.open('img/low2.jpg')    
im2 = im.transform(im.size, Image.AFFINE, (1,0,1,0,1,1))
im3 = ImageChops.subtract(im, im2)
im3 = np.asarray(im3)
im3 = np.sum(im3,axis=0)[:-1]
mean = np.mean(im3)

peak_spacing = np.diff([i for i,v in enumerate(im3) if v > mean*2])

mean_spacing = np.mean(peak_spacing)
std_spacing = np.std(peak_spacing)

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

Файл "pixelated.py", строка 11, в peak_spacing = np.diff ([i для i, v в перечислении (im3), если v> означает * 2]) ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

Как я могу это исправить? Я новичок в Python, пожалуйста, дайте мне любую идею или помощь.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Проблема в v > mean*2, которая приводит к массиву логических значений.

Логическое значение такого массива неоднозначно для if. Как следует из текста ошибки, вам нужно сообщить Python, все ли значения должны быть True:

(v > mean * 2).all()

или если одного из них достаточно:

(v > mean * 2).any()
0 голосов
/ 26 апреля 2018

Также кажется, что этот код хорошо работает с изображениями в градациях серого. Но терпит неудачу следующим образом с RGB. Итак, попробуйте преобразовать изображение в оттенки серого

im = im.convert("L")  

сразу после инициализации изображения

0 голосов
/ 26 апреля 2018

Похоже, v это массив numpy. Когда вы сравниваете пустой массив с чем-то, генерируется новый массив логических значений. Это означает, что v > m*2 создает массив (например, [True, False, False, ... True]). Невозможно получить единственное логическое значение из такого списка и использовать его в выражении if. Поэтому попробуйте использовать np.any(v > m*2) или np.all(v > m*2) в зависимости от логики вашего кода.

...