通过在不使用循环的情况下转换其RGB值,将RGB值更改为单个值

2024-06-16 12:31:51 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个彩色图像img。现在,我想基于图像的RGB值创建一个新的NumPy数组。我可以通过基于img值的循环来实现这一点,并基于RGB值计算新的数组值:比如说,newVal = R * val + G * val2 + B * val3。然后newVal将被追加到NumPy数组变量newNumpyVar

说我有这个

img = [[[1 2 3] [0 0 1] [ 1 1 1]] [[0 0 0] [1 1 1] [ 0 0 0]]]

这是一个3x2的图像。结果应该是一个6newVal数组。第一个数组是1*1 + 2*2 + 3*3,第二个数组是=0*1 + 0*2 + 1*3,第三个数组是=1*1 + 1*2 + 1*3,依此类推

我知道有一种方法可以以一种全新的方式做到这一点。但我不知道怎么做


Tags: 方法图像numpyimg方式valrgb数组
2条回答

您正在寻找图像与权重列表的和积。如果您有一个形状为(M, N, 3)且权重为vRvGvB的图像img,则可以执行以下任一操作以获得加权(M, N)图像:

img @ [vR, vG, vB]
np.dot(img, [vR, vG, vB])
np.einsum('mnc,c->mn', img, [vR, vG, vB])
np.sum(img * [vR, vG, vB], axis=-1)

最简单,但不控制每个通道的贡献量(color_im是一个numpy数组):

gray_im = color_im.mean(axis=-1)

重量:

gray_im = color_im[...,0]*R_weight + color_im[...,1]*G_weight + color_im[...,2]*B_weight # assumes RGB ordering of channels

加权版本可以等效地重写为:

gray_im = (color_im * np.array([R_weight, G_weight, B_weight])).sum(axis=-1)

相关问题 更多 >