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

Python 切片以更改numpy.array图像上的像素颜色,python,arrays,numpy,Python,Arrays,Numpy,在上一个问题上,我问了如何使用opencv(BGR格式)更改上传到numpy.array上的图像的颜色。目标是将任何小于255的红色通道值转换为255 最佳答案是: img[img[:, :, 2] < 255] = 255 这必须像这样读:if(img[:,:,2]

在上一个问题上,我问了如何使用opencv(BGR格式)更改上传到numpy.array上的图像的颜色。目标是将任何小于255的红色通道值转换为255

最佳答案是:

img[img[:, :, 2] < 255] = 255
这必须像这样读:if(img[:,:,2]<255),然后使这个像素红色通道=255,但我不知道如何读代码行使它听起来像那样


有人能给我解释清楚这个代码行吗?这样我就可以修改它了?写的时候我应该怎么读呢?

首先,我不认为表达式能满足您的需要:将任何小于255的红色通道值转换为255。如果相应的红色通道值小于255,它会将所有三个通道的像素转换为255。如果您只想更改红色通道,则需要:

img[img[:, :, 2] < 255, 2] = 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]]])
img=np.arange(12).重塑(2,2,3)
img
#数组([[0,1,2],
#         [ 3,  4,  5]],
#        [[ 6,  7,  8],
#         [ 9, 10, 11]]])
img[img[:,:,2]<5,2]=5
img
#数组([[0,1,5]),此像素的红色通道修改为5
#        [ 3,  4,  5]],
#
#       [[ 6,  7,  8],
#        [ 9, 10, 11]]])

这使用numpy。简单地说,赋值就是执行
语句试图执行的操作,替换布尔掩码(由img[:,:,2]<255生成)为真的值,并保留掩码为假的值。

这称为逻辑索引


让我们将其分为两部分:

c=img[:, :, 2] < 255 # construct a boolean array

例如,假设您有一个数组
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]

编辑代表图像的数据数组的索引
2
时,它不是指蓝色而不是红色(如注释中所述)?
b=A>11 # [0, 1, 1, 1, 1]
A[b]=2
[10, 2, 2, 2, 2]