【发布时间】:2020-05-22 06:44:30
【问题描述】:
科学问题:
我有很多 3D 体积,其中都有一个圆柱体,圆柱体在 z 轴上“直立”。包含圆柱体的体积非常嘈杂,就像超级嘈杂一样,您无法像人类一样看到其中的圆柱体。如果我将这些体积的 1000 个平均放在一起,我可以看到圆柱体。每个卷都包含一个圆柱体的副本,但在少数情况下,圆柱体的方向可能不正确,所以我想要一种方法来解决这个问题。
我想出的解决方案:
我获取了平均体积并将其投影到 z 和 x 轴上(仅投影 numpy 数组),以便在一个方向上得到一个漂亮的圆圈,在另一个方向上得到一个矩形。然后我获取每个 3D 体积并沿 Z 轴投影每个单独的体积。 SNR 仍然很差,我看不到一个圆圈,但如果我平均 2D 切片,我可以在平均几百个之后开始看到一个圆圈,并且在前 1000 个平均后很容易看到。为了计算每个体积的分数,我计算了 3D 体积相对于其他三个阵列沿 z 投影的 MSE,第一个是沿 Z 投影的平均值,然后是沿 y 或 x 投影的平均值,最后是一个带有噪声在其中的正态分布。
目前我有以下内容,其中 RawParticle 是 3D 数据,Ave 是平均值:
def normalise(array):
min = np.amin(array)
max = np.amax(array)
normarray = (array - min) / (max - min)
return normarray
def Noise(mag):
NoiseArray = np.random.normal(0, mag, size=(200,200,200))
return NoiseArray
#3D volume (normally use a for loop to iterate through al particles but for this example just showing one)
RawParticleProjected = np.sum(RawParticle, 0)
RawParticleProjectedNorm = normalise(RawParticleProjected)
#Average
AveProjected = np.sum(Ave, 0)
AveProjectedNorm = normalise(AveProjected)
#Noise Array
NoiseArray = Noise(0.5)
NoiseNorm = normalise(NoiseArray)
#Mean squared error
MSE = (np.square(np.subtract(RawParticleProjectedNorm, AveProjectedNorm))).mean()
然后我将 Ave 与轴 1 相加重复此操作,然后再次将 Raw 粒子与 Noise 数组进行比较。
但是,当我比较应该都是圆形的投影时,我的输出给出了最高的 MSE,如下所示:
我对 MSE 的理解是,其他两个人群应该有高 MSE,而我同意的人群应该有低 MSE。也许我的数据对于这种类型的分析来说太嘈杂了?但如果这是真的,那么我真的不知道该怎么做。
如果有人可以浏览我的代码或启发我对 MSE 的理解,我将非常感激。
感谢您花时间浏览和阅读。
【问题讨论】:
-
也许像
dist = np.sum(A*B)这样的距离度量适合你的问题,两个矩阵都归一化A /= np.linalg.norm(A) -
@scleronomic 感谢您的回复。我已经尝试过您的建议,但是由于数据的性质,它确实会产生一些问题。数据非常嘈杂,因此在我的数据和噪声数组之间进行的这种测量会产生比其他两个值大得多的数字。第二个问题是,因为当我的平均值投影到侧面时,我只是将像素相乘,所以在一个大矩形而不是一个较小的圆圈中总会有很多非常高值的像素,所以总是会产生最高值通过将投影乘以 y/x。
-
也许this question 对如何测量噪音有帮助
-
@scleronomic 嘿,对不起,我很久以前就想回复但完全忘记了。不幸的是,您的方法不起作用,但在与实验室和主管讨论后,我认为问题可能是通过标准方法这是不可能的解决方案,我可能不得不在傅里叶空间中玩耍以首先提升某些频率(由于低 SNR)。最后,我在其他人的数据上测试了代码,它在他们的数据上按预期工作,这很好。感谢您抽出宝贵时间回答,因为当我有机会在傅立叶空间中进行基于频率的滤波时,我可能会使用这种方法。
-
不用担心。很抱歉在这里它不起作用,但公平地说,我并没有做太多不同的事情。只是觉得这听起来很有趣,并想重现这个问题。希望你能找到解决办法。一切顺利。
标签: python numpy image-processing mean-square-error