我有5张288x288 ndarray形式的灰度图像。每个ndarray中的值只是numpy.float32数,范围从0.0到255.0。对于每个ndarray,我创建了一个numpy.ma.MaskedArray对象,如下所示:

def bool_row(row):
    return [value == 183. for value in row]

mask = [bool_row(row) for row in nd_array_1]
masked_array_1 = ma.masked_array(nd_array_1, mask=mask)


183.表示图像中的“垃圾”。所有5张图片中都有一些“垃圾”。我想获取被遮罩图像的中值,在此取每个点的中值应忽略任何被遮罩的值。结果将是没有垃圾的正确图像。

当我尝试:

ma.median([masked_array_1, masked_array_2, masked_array_3, masked_array_4, masked_array_5], axis=0)


我得到的似乎是中间值,除了不忽略掩码值,它把它们视为183.,所以结果只是所有图片中的叠加垃圾。当我只取两个蒙版图像的中值时:

ma.median([masked_array_1, masked_array_2], axis=0)


看起来好像开始做正确的事,但随后将183.的值放到了两个掩码数组都包含MaskedConstant的位置。

我可以执行以下操作,但是我觉得可能有一种方法可以使ma.median的行为符合预期:

unmasked_array_12 = ma.median([masked_array_1, masked_array_2], axis=0)
mask = [bool_row(row) for row in unmasked_array_12]
masked_array_12 = ma.masked_array(unmasked_array_12, mask=mask)

unmasked_array_123 = ma.median([masked_array_12, masked_array_3], axis=0)
mask = [bool_row(row) for row in unmasked_array_123]
masked_array_123 = ma.masked_array(unmasked_array_123, mask=mask)

...


如何使ma.median正常工作而又不导致上述不愉快?

最佳答案

我怀疑问题出在ma.median如何处理非数组参数。它可能将列表转换为普通的numpy数组,而不检查列表元素的类型。

考虑下面的一维数组示例:

In [64]: a = ma.array([1, 2, -10, 3, -10, -10], mask=[0,0,1,0,1,1])

In [65]: b = ma.array([1, 2, -10, -10, 4, -10], mask=[0,0,1,1,0,1])

In [66]: a
Out[66]:
masked_array(data = [1 2 -- 3 -- --],
             mask = [False False  True False  True  True],
       fill_value = 999999)


In [67]: b
Out[67]:
masked_array(data = [1 2 -- -- 4 --],
             mask = [False False  True  True False  True],
       fill_value = 999999)


以下是不正确的-它似乎忽略了掩码:

In [68]: ma.median([a, b])
Out[68]: -4.5

In [69]: ma.median([a, b], axis=0)
Out[69]:
masked_array(data = [  1.    2.  -10.   -3.5  -3.  -10. ],
             mask = False,
       fill_value = 1e+20)


但是,如果我首先使用ma.array创建一个新的蒙版数组,则ma.median可以正确处理它:

In [70]: c = ma.array([a, b])

In [71]: c
Out[71]:
masked_array(data =
 [[1 2 -- 3 -- --]
 [1 2 -- -- 4 --]],
             mask =
 [[False False  True False  True  True]
 [False False  True  True False  True]],
       fill_value = 999999)


In [72]: ma.median(c)
Out[72]: 2.0

In [73]: ma.median(c, axis=0)
Out[73]:
masked_array(data = [1.0 2.0 -- 3.0 4.0 --],
             mask = [False False  True False False  True],
   fill_value = 1e+20)


因此,要解决您的问题,可能就像替换它一样简单:

ma.median([masked_array_1, masked_array_2, masked_array_3, masked_array_4, masked_array_5], axis=0)


有了这个:

stacked = ma.array([masked_array_1, masked_array_2, masked_array_3, masked_array_4, masked_array_5])
ma.median(stacked, axis=0)

关于python - 查找代表图像的蒙版ndarray的中值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18691889/

10-12 19:23