将一个数组中的值替换为另一个数组中相同索引的值?

时间:2019-02-21 18:32:11

标签: python numpy logical-mask

我有两个3D numpy.array对象,它们代表两个图像。我有一个代码,可以将图像中的每个黑色像素替换为白色,但是,我想将第一幅图像中非黑色的每个像素替换为另一幅图像中的“平行”像素颜色。如何通过更改代码来做到这一点?谢谢!

r1, g1, b1 = 0, 0, 0  # Original value
r2, g2, b2 = 255, 255, 255  # Value that we want to replace it with

red, green, blue = image[:, :, 0], image[:, :, 1], image[:, :, 2]
mask = (red == r1) & (green == g1) & (blue == b1)
image[:, :, :3][mask] = [r2, g2, b2]

2 个答案:

答案 0 :(得分:1)

您可以使用numpy.sum来测试像素是否为黑色,因为当且仅当像素为黑色时,该像素的rgb总和将为零。对该求和进行的测试提供了可用于更新图像的蒙版。

import numpy as np
# Assume image1 and image2 exist in memory as 3-dimensional numpy.arrays
# with shapes (M,N,k) where k is the channel depth (r,g,b -> k=3)
mask = np.sum(image1,axis=-1) > 0
image1[mask] = image2[mask]

答案 1 :(得分:0)

您可以创建一个掩码,以选择性地对数组中的项目进行操作。使用2d数组更容易可视化,因此例如:

import numpy as np

a = np.random.randint(0, 10, (5, 4))
b = np.random.randint(0, 10, (5, 4))

让我们看一下a和b的样子。

In [317]: a
Out[317]: 
array([[6, 0, 4, 0],
       [1, 9, 1, 6],
       [7, 2, 5, 0],
       [8, 3, 5, 0],
       [1, 8, 1, 6]])

In [318]: b
Out[318]: 
array([[1, 3, 2, 1],
       [9, 1, 9, 4],
       [9, 4, 5, 5],
       [6, 0, 6, 4],
       [5, 1, 1, 2]])

假设我们要选择a == 0和b == 3的位置,我们建立一个索引(掩码)。     idx =(a == 0)&(b == 3)

idx看起来如何?

In [320]: idx
Out[320]: 
array([[False,  True, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])

现在,如果要对a == 0和b == 3的数组a进行运算(假设我们要使a值等于b值:

a[idx] = b[idx]

现在看起来像什么?

In [322]: a
Out[322]: 
array([[6, 3, 4, 0],
       [1, 9, 1, 6],
       [7, 2, 5, 0],
       [8, 3, 5, 0],
       [1, 8, 1, 6]])

掌握了这些知识之后,您可以将相同的方法应用于3d数组(尽管更难以可视化)。

# identify pixels that are NOT black (i.e. not equal to 0 0 0)
idx = (image1[:, :, 0] == 0) & (image1[:, :, 1] == 0) & (image1[:, :, 2] == 0)

image1[~idx] = image2[~idx]