Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代所有像素以检查哪些像素是白色的,哪些是黑色的_Python_Opencv - Fatal编程技术网

Python 迭代所有像素以检查哪些像素是白色的,哪些是黑色的

Python 迭代所有像素以检查哪些像素是白色的,哪些是黑色的,python,opencv,Python,Opencv,我试图迭代一个只有黑白像素的图像。对于每个黑色像素,我想减少一个分数,而对于每个白色像素,我想增加一个分数。但是,在测试以下代码时,我发现此错误: ValueError: The truth value of an array with more than one element is ambiguous. 它与img[i,j]语句有关。那个区域怎么可能有多个像素?我不是通过使用img[I,j]专门调用一个像素吗?是否有人知道我如何解决这个问题,或者是否有另一种访问1个特定像素的工作方法 de

我试图迭代一个只有黑白像素的图像。对于每个黑色像素,我想减少一个分数,而对于每个白色像素,我想增加一个分数。但是,在测试以下代码时,我发现此错误:

ValueError: The truth value of an array with more than one element is ambiguous.
它与
img[i,j]
语句有关。那个区域怎么可能有多个像素?我不是通过使用
img[I,j]
专门调用一个像素吗?是否有人知道我如何解决这个问题,或者是否有另一种访问1个特定像素的工作方法

def score(img):
    score = 0

    height, width, _ = img.shape
    for i in range(height):
        for j in range(width):
            if img[i, j] == [255,255,255]:
                score = score + 1
            else:
                score = score - 1
    print(score)
该图像是使用openCV库读取的。然后对原始图像进行特定颜色的过滤,从而创建遮罩。如前所述,此遮罩只有黑白像素

img = cv2.imread("images/test.jpg")
mask = cv2.inRange(img, lower_bound, upper_bound)

这是因为
img[i,j]
给出了一个带有RGB值的数组

img[i,j]=[0,0,0]#表示黑色

img[i,j]=[255,255,255]#表示白色

这些数组与
True
False
没有关联。你需要改变你的状况

>>> img[0,0] == [0,0,0]
array([ True,  True,  True])
>>> all(img[0,0] == [0,0,0])
True

您的条件需要一个
all()

这意味着您的数组具有三维。您可以打印
img[i,j]
以查看其外观。您想要的值可能经常位于同一位置,因此调用
img[i,j,0]
img[i,j,1]
应该会起作用^=

from PIL import Image

# load image
img = Image.open('BlackWhite.gif').convert('RGB')
pixel = img.load()

# calculate the score
score = 0
w=img.size[0]
h=img.size[1]
for i in range(w):
  for j in range(h):
      if pixel[i, j] == (255, 255, 255):
          score += 1
      elif pixel[i, j] == (0, 0, 0):
          score -= 1

img
有三个维度,因此
img[i,j]
不是一个单一的值,而是一个向量。如果第三个维度是
1
,您可以只做
img[i,j,0]
。但是,在这种情况下,你可以只做
score=2*np.count\u nonzero(img)-img.size
。首先
print(score)
不起作用,你能告诉我你用哪个库(至少,最好是你如何定义)来创建图像吗?打印的缩进是错误的,我修正了它。为了创建图像,我使用了openCV。我将更新问题。变量和函数名相同。。这不是个好主意!有opencv api查询图像格式、通道数、ecc深度。请这样做,然后更新您的问题,如果您不指定图像的详细信息,以下答案就没有意义了。我将if测试更改为
if img[i,j]==[255255255]:
但仍然是相同的错误它是一个数组,而不是列表,更像数组([255,255,255])嗯奇怪,即使是
numpy.array([255255255])
没有区别我很糟糕,刚刚意识到比较给出了一个数组,你需要用all()将它包围起来才能得到一个值。如果我将If测试改为
如果img[I,j,0]=[255255]:
或者
如果img[I,j,1]=[255255]:
它仍然会给我相同的错误。