首页 > 解决方案 > [x](y) 运算符到底是做什么的?

问题描述

我的目标是逐像素评估图像。代替:

count = 0
for x in range(w):
  for y in range(h):
    pixel_1, pixel_2 = img_1[x, y], img_2[x, y]
      if pixel_1 == 0 and pixel_2 == 0:
        count += 1

我已经看到了一种通过使用 [] 和 () 运算符来做到这一点的方法:

sum((img_1 == 0)[img_2 == 0])

我试图理解这意味着什么。我一直在尝试搜索它,但我不知道描述它的正确术语。我也试图一次将它应用于三个图像:

sum((img_1 == 0)[img_2 == 0 and img_3 == 0])

但这不起作用。任何帮助,将不胜感激。提前致谢。

标签: pythonimagenumpyopencvimage-processing

解决方案


这条线上发生了很多事情:

sum((img_1 == 0)[img_2 == 0])

首先,img_1 == 0是一个返回 1 的 numpy 数组的操作,其中imp_1不为零,否则为 0。尝试打印它以查看。该数组的保存大小为img_1. 括号内的操作与img_2的操作基本相同。

True在这里,在 中有 0 的地方有1(相当于) a1

a1 = np.arange(2*3).reshape(2, 3)
# array([[0, 1, 2],
#        [3, 4, 5]])

a1 == 0
# array([[ True, False, False],
#        [False, False, False]])

括号img_1 == 0只是在这里,因此以下索引操作(由括号具体化)适用于结果img_1 == 0而不是0数字。. 它不是一种操作,而是一种对某些操作进行分组和优先处理的方法(请参阅@hpaulj 评论)。

所涉及的最后一个操作——由括号具体化的操作——是索引操作。首先注意(img_1 == 0)img_2 == 0大小相同(考虑到两个图像的大小相同)。此操作仅检索(img_1 == 0)存在 0 的元素in img_2这会根据括号内指定的索引从数组中“选择”元素。

这里有三个 1a在不同的位置。该操作仅检索awherea == 1为 true 的元素,因此它返回三个元素:

a = np.array([[1, 2, 1], [3, 1, 4]])
a[a == 1]
# array([1, 1, 1])

这种求和运算不是最容易理解的形式,您可以将其用于您的 3-image 案例:

((img1 == 0) & (img2 == 0) & (img3 == 0)).sum()

这读起来很好:“创建一个包含 1 和 0 的 numpy 数组,其中 imag1 中有 0 并且 img2 中有 0 并且 ...,然后对这个数组求和”。


推荐阅读