如何使用numpy数组切片遮罩图像灰度

时间:2019-06-21 00:38:15

标签: python image-processing numpy-broadcasting numpy-slicing

我需要替换另一幅图像(第二幅图像)灰度的“映射值”,然后替换一张图像(最终图像)的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”

我的目标是一种从B到C替换一组值(由相同的索引位置决定)的方法,该值是根据A上条件的索引图进行切片的。

1 个答案:

答案 0 :(得分: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]