【问题标题】:Masking Using Pixel Statistics使用像素统计遮罩
【发布时间】:2020-06-30 06:11:06
【问题描述】:

我正在尝试掩盖从检测器获取的数据集中的坏像素。为了想出一个通用的方法来做到这一点,以便我可以在不同的图像上运行相同的代码,我尝试了几种不同的方法,但没有一个最终能奏效。我对 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 个标准偏差,并且将其设置为零。

【问题讨论】:

    标签: python numpy image-processing data-analysis masking


    【解决方案1】:

    这是一种在较大图像上会稍微快一些的方法:

    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]])
    

    【讨论】:

    • 这行得通,而且比我尝试做的要简单得多,谢谢!
    【解决方案2】:

    你的 A 是三维的,所以你需要使用下面的三个变量来解包。

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

    【讨论】:

    • for 循环正在工作,这是一个不同的错误。你应该使用调试器来检查它在哪里抛出这个错误。
    • 我不认为这是正确的,因为 A[0,2] 对应于数组中的数字 6。即,它是“哪一行,哪一列”语句。
    • 对不起哪个声明?你是说你不能用这个循环打印 A 吗?答案解决您的ValueError,如果您有进一步的问题,请提出不同的问题。
    • 您的编辑澄清了它,但这仍然不是我想要的。保持简单,您将如何在新行上打印数组中的每个项目?即,``` 3 5 50 ... ```
    • 你可以做print(i) print(j) print(k)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2016-01-07
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多