数据立方体的高斯卷积
Posted
技术标签:
【中文标题】数据立方体的高斯卷积【英文标题】:Gaussian convolution of data cube 【发布时间】:2017-11-14 15:31:54 【问题描述】:我有一个名为“立方体”的数据立方体。我需要将每个二维切片与高斯核进行卷积。
但是,使用下面的代码,这会使用归一化的高斯核,它会稀释每个切片中较弱的像素。
有没有办法将每个像素高斯除以“max(Gaussian)”,以便每个像素相对于像素强度进行卷积?
import numpy as np
from astropy.convolution import convolve, Gaussian2DKernel
std = 2
gauss_kernel = Gaussian2DKernel(std)
for i in range(len(cube[:,0,0])):
cube[i,:,:] = convolve(cube[i,:,:], gauss_kernel/np.max(gauss_kernel))
【问题讨论】:
在卷积之后将结果除以切片,难道不会得到几乎相同的效果吗? 我不确定。我相信这里发生的是,对于每个元素(或像素),然后对分布在相邻元素上的卷积高斯进行归一化。因此,较高值元素对较低值像素的影响不同。但我需要的是元素保留其原始值,然后以高斯方式将模糊散布到其他元素中。卷积后除以切片只会将每个元素设置为一个,不是吗? 您发布的解决方案已经说明了如何与峰值归一化高斯进行卷积。默认值是与积分归一化高斯卷积。你还想要什么?您可能希望将spectral-cube.readthedocs.io/en/latest/… 用于平滑立方体中每个通道的一般用例 【参考方案1】:您发布的解决方案已经说明了如何与峰值归一化高斯进行卷积。从您的评论中,听起来您希望您的“峰值”不受周围数据点的影响。严格来说,这是不可能的 - 卷积意味着 每个 像素都会“散开”。
但是,您可能正在谈论 标准化卷积,它是 astropy 实现的(请参阅 http://docs.astropy.org/en/stable/convolution/index.html)。只要将周围像素设置为 NAN,它们就不会对其邻居做出任何贡献。因此,如果您有一个人口稀少的数组,只有几个像素要模糊为周围的“空”像素,只需将“空”像素设置为 NaN。看这个例子:http://docs.astropy.org/en/stable/convolution/index.html#using-astropy-s-convolution-to-replace-bad-data
【讨论】:
【参考方案2】:我相信,您的问题与内核和卷积有关。
假设你有一些数组;
arr = np.ones((5,5))
而且你还有一些 2D 卷积核
kernel = [[0,0,0],
[0,1,0],
[0,0,0]]
在这种情况下,它是身份内核,所以如果你做conv(arr,kernel)
,你应该得到arr。
如果我们将内核更改为一维框模糊内核会怎样?
kernel = [[0,1,0],
[0,1,0],
[0,1,0]]
您不应该期望得到 arr
的模糊版本,即峰值为 1 的数组。考虑元素 (3,3)
- 旧值是 1,卷积后它将是 1*arr[3,2] + 1*arr[3,3] + 1*arr[3,4] = 3
。相反,如果 kernel
的中心列有 0.33,您将获得每个元素的 1/3,并且该值将保持为 1。
这区分了卷积核的几类 - 有的是 unnormalized 并且它们的值是不受约束的,那些是 unit peak 并且最大值为 1,以及总和为 1 的单位能量。
图像中的总能量(所有值的总和)将随着未归一化或单位峰值内核的变化而变化。如果用单位能量核进行卷积,图像中的总能量在前后保持不变。
解决您的评论:
有没有办法将每个像素高斯除以“max(Gaussian)”,以便每个像素相对于像素强度进行卷积?
如果您想要的行为是让明亮的事物(星星)比黑暗的事物(背景)更模糊,那自然会发生。或者,更具体地说,高对比度事物比低对比度事物更模糊。想象一下相机,它可以是数码单反相机或您的手机或其他任何东西。如果蓝色、万里无云的天空失焦,你能分辨出来吗?如果一颗星星没有对焦,你能分辨出来吗?
如果您想以某种方式对卷积中的像素值进行加权,那么您应该复制您的数据并按适当的权重缩放每个像素,然后将修改后的数据与您的内核进行卷积。
【讨论】:
感谢您提供的信息非常丰富!我认为你是对的,从某种意义上说,我对这个过程缺乏了解是问题所在,而卷积实际上可以正常工作。以上是关于数据立方体的高斯卷积的主要内容,如果未能解决你的问题,请参考以下文章