gpt4 book ai didi

python - 寻找表示图像的掩码 ndarrays 的中值

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:51 26 4
gpt4 key购买 nike

我有 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 - 寻找表示图像的掩码 ndarrays 的中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com