使用像素统计进行掩蔽
Masking Using Pixel Statistics
我正在尝试屏蔽从检测器获取的数据集中的坏像素。在我试图想出一个通用的方法来做到这一点以便我可以 运行 跨不同图像使用相同的代码时,我尝试了几种不同的方法,但其中 none 最终起作用了。我对 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: too many values to unpack (expected 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
这会抛出一个错误 'unsupported iterator index'。我想要发生的是 for 循环遍历数组中的每个元素,检查它是否 less/greater 比均值的 2 个标准偏差,并且将其设置为零。
你 A 是三维的,所以你需要使用如下三个变量解包。
A = np.array([[3,5,50],[30,2,6],[25,1,1]])
for i in A:
for j in i:
print(j)
这是一种处理较大图像的方法,速度会稍快一些:
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]])
我正在尝试屏蔽从检测器获取的数据集中的坏像素。在我试图想出一个通用的方法来做到这一点以便我可以 运行 跨不同图像使用相同的代码时,我尝试了几种不同的方法,但其中 none 最终起作用了。我对 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: too many values to unpack (expected 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
这会抛出一个错误 'unsupported iterator index'。我想要发生的是 for 循环遍历数组中的每个元素,检查它是否 less/greater 比均值的 2 个标准偏差,并且将其设置为零。
你 A 是三维的,所以你需要使用如下三个变量解包。
A = np.array([[3,5,50],[30,2,6],[25,1,1]])
for i in A:
for j in i:
print(j)
这是一种处理较大图像的方法,速度会稍快一些:
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]])