numPy的高级索引如何用于布尔掩码?

时间:2018-07-14 02:03:52

标签: python-3.x image numpy syntax

我对Python还是很陌生,并且在理解以下代码的工作方式方面很挣扎。

我将图像读入numpy数组。与此类似:

# Read the image image = mpimg.imread('images/rgb-road.png')

此后,我设置了一个三值边界列表rgb_boundary [123,231,122]。这些值无关紧要。

然后是令人困惑的部分。

boundary = (image[:,:,0] < rgb_boundary[0]) \
            | (image[:,:,1] < rgb_threshold[1]) \
            | (image[:,:,2] < rgb_threshold[2])
image[boundary] = [0,0,0]

这是由于我对Python语法的了解不足以及使用图片导致的。

如果有人可以解释以上代码中发生的事情,我将非常高兴。特别是在具有image [boundary]分配的行中。我的图片值已更改,但是我不知道这在Python中是如何工作的。

此外,如果有资源可以让我阅读它的工作方式/原因,请随时向我推荐。

谢谢!

1 个答案:

答案 0 :(得分:0)

让我们从第一个执行的片段开始:

image[:,:,0] < rgb_boundary[0]

现在,rgb_boundary[0]就是123,所以这样做是找到图像中第一种颜色(红色)小于123强度的位置(大约是255的一半亮度)是最大亮度)。

以上表达式的结果将是一个2D布尔数组,红色字节小于123的地方为True,其他地方为False。

然后我们可以理解以下代码:

boundary = (image[:,:,0] < rgb_boundary[0]) \
         | (image[:,:,1] < rgb_boundary[1]) \
         | (image[:,:,2] < rgb_boundary[2])

它正在创建一个名为boundary的2D蒙版,对于红色小于123或绿色小于231或蓝色小于122的任何像素,它将为TrueFalse在任何不满足这些条件的地方。

最后:

image[boundary] = [0,0,0]

这会将所选像素设置为黑色。在NumPy中,可以将boundary之类的布尔掩码与“ fancy indexing”一起使用,以创建数组的“视图”。在这种情况下,无论[0,0,0]条件为image的何处,“视图”都将boundary(黑色)分配给True