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

2024-04-28 16:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检测图像是否被卷曲。所以我使用了一个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)

我得到了这个错误:

File "pixelated.py", line 11, in peak_spacing = np.diff([i for i,v in enumerate(im3) if v > mean*2]) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我该怎么解决这个问题?我是Python的新手,请告诉我任何想法或帮助。在


Tags: inimageimportforifnpdiffmean
3条回答

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

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

(v > mean * 2).all()

或者如果其中任何一个足够:

^{pr2}$

看起来v是一个numpy数组。当你比较一个numpy数组和一些东西时,会生成一个新的布尔数组。这意味着v > m*2生成一个数组(例如[True, False, False, ... True])。从这样的列表中获取单个布尔值并将其用于if表达式是不可能的。因此,根据您的代码逻辑,尝试使用np.any(v > m*2)或{}。在

同样,这段代码似乎能很好地处理灰度图像。但在以下RGB中失败。 所以,试着把图像转换成灰度

im = im.convert("L")  

就在图像初始化之后

相关问题 更多 >