0

我需要替换图像(最终图像)的 8 位值(0 到 255)索引集,遵循来自另一个图像(第二个图像)灰度的“地图值”,相关地图索引是从主图像中选择的。

事实上,这与 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)具有相同的形状/大小数组(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 上的条件索引映射对其进行切片。

4

1 回答 1

1

您可以通过使用 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]

于 2019-06-21T01:01:59.260 回答