使用像素统计信息进行遮罩



我正在尝试屏蔽从检测器获取的数据集中的坏像素。在我试图想出一个通用的方法来实现这一点,这样我就可以在不同的图像上运行相同的代码时,我尝试了一些不同的方法,但都没有成功。我对Python的编码和数据分析还很陌生,所以我可以用一只手把东西放在计算机能够理解的术语里。

例如,考虑矩阵

A = np.array([[3,5,50],[30,2,6],[25,1,1]])

我想做的是设置A中的任何元素,距离平均值有两个标准偏差,等于零。原因是在代码的后面,我定义了一个只使用非零值进行计算的函数,因为零是掩码的一部分。

我知道这种掩蔽技术是有效的,但我尝试扩展以下代码来处理标准偏差:

mask = np.ones(np.shape(A))
mask.flat[A.flat > 20] = 0

我尝试的是:

mask = np.ones(np.shape(A))
for i,j in A:
mask.flat[A[i,j] - 2*np.std(A) < np.mean(A) < A[i,j] + 2*np.std(A)] = 0

哪个抛出错误:

ValueError:太多的值无法解压缩(应为2(


如果有人有更好的技术来统计去除图像中的坏像素,我会洗耳恭听的。谢谢你的帮助!

==============

编辑

经过一番尝试和错误之后,我找到了一个可以帮助我澄清问题的地方。新代码是:

for i in A:
for j in i:
mask.flat[ j - 2*np.std(A) < np.mean(A) < j + 2*np.std(A)] = 0

这会引发一个错误,称为"不支持的迭代器索引"。我想做的是,for循环在数组中的每个元素上迭代,检查它是否小于/大于平均值的2个标准偏差,并将其设置为零。

以下是一种在较大图像上速度更快的方法:

import numpy as np
import matplotlib.pyplot as plt
# generate dummy image
a = np.random.randint(1,5, (5,5))
# generate dummy outliers
a[4,4] = 20
a[2,3] = -6
# initialise mask
mask = np.ones_like(a)
# subtract mean and normalise to standard deviation.
# then any pixel in the resulting array that has an absolute value > 2 
# is more than two standard deviations away from the mean
cond = (a-np.mean(a))/np.std(a)
# find those pixels and set them to zero.
mask[abs(cond) > 2] = 0

检查:

a
array([[ 1,  1,  3,  4,  2],
[ 1,  2,  4,  1,  2],
[ 1,  4,  3, -6,  1],
[ 2,  2,  1,  3,  2],
[ 4,  1,  3,  2, 20]])
np.round(cond, 2)
array([[-0.39, -0.39,  0.11,  0.36, -0.14],
[-0.39, -0.14,  0.36, -0.39, -0.14],
[-0.39,  0.36,  0.11, -2.12, -0.39],
[-0.14, -0.14, -0.39,  0.11, -0.14],
[ 0.36, -0.39,  0.11, -0.14,  4.32]])
mask 
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0]])

您的A是三维的,因此您需要使用以下三个变量进行解包。

A = np.array([[3,5,50],[30,2,6],[25,1,1]])
for i in A:
for j in i:
print(j)

最新更新