我需要检测图像是否是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的新手,请给我任何想法或帮助。
答案 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")
在图像初始化之后