【问题标题】:Iterate over all pixels to check which pixels are white and which are black遍历所有像素以检查哪些像素是白色的,哪些是黑色的
【发布时间】:2019-06-04 10:09:30
【问题描述】:

我正在尝试迭代只有黑白像素的图像。对于每个黑色像素,我想降低一个分数,而对于每个白色像素,我想增加一个分数。然而,在测试以下代码时,我得到了这个错误:

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 有三个维度,所以img[i, j] 不是单个值,而是一个向量。如果第三维是1,你可以直接使用img[i, j, 0]。但是,在这种情况下,您可以使用score = 2 * np.count_nonzero(img) - img.size
  • 首先print(score) 不起作用,您能否说明您使用哪个库(至少,最好是您定义的方式)来创建图像
  • 打印的缩进错误,我修好了。为了创建图像,我使用了 openCV。我会更新问题。
  • 变量和函数名相同..不是个好主意!
  • 有opencv api可以查询图片格式、通道数、深度ecc。请这样做,然后更新您的问题,如果您不指定图像的详细信息,以下答案将毫无意义

标签: python opencv


【解决方案1】:

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

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

img[i, j] = [255, 255, 255] # 为白色

并且这些数组与TrueFalse 无关。你需要改变你的状况。

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

您的病情需要all()

【讨论】:

  • 我将 if-test 更改为 if img[i,j] == [255,255,255]: 但仍然是同样的错误
  • 是数组,不是列表,更像是array([255, 255, 255])
  • 嗯很奇怪,即使numpy.array([255,255,255])没有区别
  • 我的错,刚刚意识到比较给出了一个数组,你需要用 all() 包围它以获得一个值。
【解决方案2】:

这意味着你的数组有 3 维。您可以打印img[i,j] 以查看它的外观。你想要的值可能经常在同一个位置,所以调用img[i,j,0]img[i,j,1] 应该可以工作

【讨论】:

  • 如果我将 if-test 更改为 if img[i,j,0] == [255,255,255]:if img[i,j,1] == [255,255,255]:,它仍然会给我同样的错误。
【解决方案3】:

给你=^..^=

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多