【问题标题】:How to mask an image gray scale using numpy array slicing如何使用 numpy 数组切片屏蔽图像灰度
【发布时间】:2019-06-21 00:38:15
【问题描述】:

我需要替换图像(最终图像)的 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 上的条件索引映射进行切片。

【问题讨论】:

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


    【解决方案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]

    【讨论】:

    • 嗨,Tom,我的意思是将 B 中的值复制到 C 中。但现在逻辑似乎很清楚了。
    • 非零值呢?避免非零值的效果,正如 matlab 中的函数 find() 所做的那样。在 python 中,将是: C[ np.nonzero(cond) ] = B[ np.nonzero( cond ) ] ?
    • 不确定我是否理解您的问题。你想对非零值做什么?
    • 我正在尝试复制相同的逻辑,如果我使用 matlabcode:find()... Imagfinal(index) = Imag2(index)。如中所述:stackoverflow.com/questions/14388786/…
    • 啊,我明白了。 np.nonzero 将数组过滤到非零元素,而不是创建非零元素的索引。我认为您想要的可以与上述解决方案相同的方式完成:C[A != 0] = B[A != 0]
    猜你喜欢
    • 2015-02-13
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2014-07-30
    • 2017-07-16
    相关资源
    最近更新 更多