如何使用 numpy 数组切片来屏蔽图像灰度

How to mask an image gray scale using numpy array slicing

我需要替换图像(最终图像)的 8 位值(0 到 255)索引集,跟随从另一图像(第二图像)灰度中选择相关地图索引的 "map values"主图像。

事实上,这与 MATLAB 所做的类似

 indexS =  find(image1 == integer ('could be a integer from 1 to 255')) 
 imagfinal(indexS) = imagsecondary(indexS).

我在堆栈上尝试了 python/matlab find() 的以下示例,例如:MATLAB-style find() function in Python。以及相关的...

我尝试了n.nonzero、np.argwhere和np.where,但我真的很困惑。

我有三个源图像,比如说 A、B、C,形状相同,例如。 (100x100) 具有不同的 0 到 255 值,我的意思是它们完全是彼此不同的灰度。

所以,第一步 - 我需要从 A 获取所有值为 1 的索引(但可以是 , 10, 196 , 最多 255),所以我做了:

Aboolean = np.equal(A,1)

结果是

       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],...

然后我尝试使用那些布尔索引数组结果从 B:

获取值
Bnew = B[Aboolean]

但它对进一步的步骤不起作用,因为结果是一个值映射并且索引丢失了...

Bnew 的值应该替换 C 图像上的相应值 8 位,我的意思是那些 8 位值到相同的位置(或相同的索引),记住 B 和 C(也是 A)有同样的 shape/size 数组 (100x100).

所以我又试了一次:


D = np.where(Aboolean,B,C)

画图的时候,最后的结果就是同一张图C!!完全没有修改。


fig, ax = plt.subplots(nrows=1, figsize=(16,20))
ax.imshow(D, cmap='gray',interpolation='nearest')

结果相同的图像'C'

我的目标是在 C 上替换 B 中的一组值(由相同的索引位置决定),这些值是根据 A 上的条件索引图进行切片的。

您可以通过使用 A 的布尔索引直接将值从 C 复制到 B(如果您不想修改原始 B,请先使用 B.copy() 创建一个副本)。

>>> import numpy as np
>>> A = np.array([0,0,1,0,0])
>>> B = np.array([1,2,3,4,5])
>>> C = np.array([10,9,8,7,6])
>>> B[A==1] = C[A==1]

>>> B
array([1, 2, 8, 4, 5])

编辑:

C[A==1] = B[A==1]