在上一个问题中,我问过如何使用opencv(BGR格式)更改numpy.array上传图像的颜色。目标是转换任何红色通道值< 255到255。
How to optimize changing the value of 3d numpy.array if meet a condition
最好的答案是:
img[img[:, :, 2] < 255] = 255
关键是我不理解发生了什么(这是一个不同的问题,因为前一个问题得到了完美的回答)。我理解这一部分:
img[:, :, 2] < 255
在红色通道上切片y,x像素并与255值进行比较。
但是,我不明白为什么它嵌入在另一个数组中:
img[...] = 255
这必须是这样的: if(img [:,:2]&lt; 255)然后使这个像素红色通道= 255 但我不知道如何阅读代码行使它听起来像那样。
任何人都可以非常清楚地解释我的代码行,所以我可以修改其他用途吗?在写这篇文章时我该如何阅读?
答案 0 :(得分:2)
首先,我不认为表达式符合您的要求:转换任何红色通道值&lt; 255到255。,如果相应的红色通道的值小于255,它会将所有三个通道的像素转换为255,如果你只想更改红色通道,则需要的是:
img[img[:, :, 2] < 255, 2] = 255
示例:
img = np.arange(12).reshape(2,2,3)
img
# array([[[ 0, 1, 2],
# [ 3, 4, 5]],
# [[ 6, 7, 8],
# [ 9, 10, 11]]])
img[img[:,:,2] < 5,2] = 5
img
#array([[[ 0, 1, 5], # the red channel of this pixel is modified to 5
# [ 3, 4, 5]],
#
# [[ 6, 7, 8],
# [ 9, 10, 11]]])
这使用了numpy boolean indexing。简单来说,赋值执行if
语句尝试执行的操作,替换布尔掩码(由 img [:,:2]&lt; 255)生成的值为true,并保持掩码为假的值。
答案 1 :(得分:2)
这称为逻辑索引。
让我们把它分成两部分:
c=img[:, :, 2] < 255 # construct a boolean array
c
等于1的所有索引用于索引img
的元素。
img[c, 2] = 255 # set img to 255 at indices in c equal to 1
例如,假设您拥有此数组A=[10, 20, 34, 90, 100]
,并且您希望将A
中所有大于11的元素更改为2。
要使用逻辑索引执行此操作,您首先要构造一个类似于此的布尔数组:
b=A>11 # [0, 1, 1, 1, 1]
然后,使用b
索引A
A[b]=2
结果数组如下所示:
[10, 2, 2, 2, 2]