切片以更改numpy.array图像上的像素颜色

时间:2017-03-27 17:42:12

标签: python arrays numpy

在上一个问题中,我问过如何使用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 但我不知道如何阅读代码行使它听起来像那样。

任何人都可以非常清楚地解释我的代码行,所以我可以修改其他用途吗?在写这篇文章时我该如何阅读?

2 个答案:

答案 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]