numpy “IMAGE[:,:,3]”在Python/OpenCV中是什么意思

0md85ypi  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(304)

我在一个堆栈溢出问题(https://stackoverflow.com/a/53737420)的答案中遇到了这行代码:

trans_mask = image[:,:,3] == 0

这将从OpenCV图像创建遮罩。我想知道image[:,:,3] == 0的语法是如何工作的。
我知道list[:]基本上是一个列表的副本,但我不知道可以传递一个元组(我相信这就是:,:,3)来索引一个列表。然后把这个比作0?

thtygnil

thtygnil1#

当对类似列表的对象进行索引时,将调用__getitem__方法。您可以创建一个简单的类,向您展示传递给该方法的内容:

class Inspector:
    def __getitem__(self, key):
        return key()

i = Inspector()
i[:,:,3] # => (slice(None, None, None), slice(None, None, None), 3)

这意味着:slice示例表示。
与0的比较也是如此:Python调用eq运算符。因此,问题中的__getitem__调用将返回另一个NumPy数组,该数组实现__eq__方法,该方法进而实现向其传递标量值,并将创建表示掩码的特定数据结构。

import numpy
arr = numpy.array([
  [[1,2,3],[4,5,6],[7,8,9]],
  [[11,12,13],[14,15,16],[17,18,19]],
  [[21,22,23],[24,25,26],[27,28,29]]
])
arr[:,:,2]

# =>

# array([[ 3,  6,  9],

# [13, 16, 19],

# [23, 26, 29]])

mask = arr[:,:,2] == 16

# =>

# array([[False, False, False],

# [False,  True, False],

# [False, False, False]])

因此,掩码只是一个包含布尔值的数字数组。

相关问题