具有多个元素的数组的真值是不明确的Python错误

时间:2018-04-26 11:19:22

标签: python python-2.7 image-processing

我需要检测图像是否是pizelized。所以我使用的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行,in       peak_spacing = np.diff([i for i,v in enumerate(im3)if v> mean * 2])   ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

我该如何解决这个问题?我是Python的新手,请给我任何想法或帮助。

3 个答案:

答案 0 :(得分:1)

问题是v > mean*2导致一个布尔值数组。

此类数组的布尔值对于if是不明确的。正如错误文本建议的那样,您需要告诉Python,是否所有值都应该是True

(v > mean * 2).all()

或者如果它们中的任何一个就足够了:

(v > mean * 2).any()

答案 1 :(得分:0)

看起来v是一个numpy数组。当您将numpy数组与某些数据进行比较时,会生成一个新的布尔数组。这意味着v > m*2生成一个数组(例如[True, False, False, ... True])。从这样的列表中获取单个布尔值是不可能的,并在if表达式中使用它。因此,请尝试使用np.any(v > m*2)np.all(v > m*2),具体取决于您的代码逻辑。

答案 2 :(得分:0)

此外,此代码似乎也适用于灰度图像。但是使用RGB会以下列方式失败。 因此,尝试将图像转换为灰度

im = im.convert("L")  

在图像初始化之后