我有两个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]
答案 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]