我有一个名为' cube'的数据立方体。我需要用高斯内核对每个2d切片进行卷积。
然而,使用下面的代码,它使用归一化的高斯内核来稀释每个切片中较弱的像素。
有没有办法将每个像素高斯分为“最大(高斯)”和“高斯”。以便每个像素相对于像素强度进行卷积?
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))
答案 0 :(得分: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
答案 1 :(得分:1)
我相信你的问题与内核和卷积有关。我相信。
假设你有一些数组;
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。
这区分了卷积内核的一些分类 - 有些非标准化且它们的值是不受约束的,那些是单位峰值并且最大值为1,以及单位能量的总和为1的那些。
图像中的总能量(所有值的总和)将随着非标准化或单位峰值内核而变化。如果你使用单位能量核心进行卷积,图像中的总能量在前后保持不变。
解决你的意见:
有没有办法将每个像素高斯分为“最大(高斯)”和“高斯”。以便每个像素相对于像素强度进行卷积?
如果你想要的行为是明亮的东西(星星)比黑暗的东西(背景)更模糊,那自然会发生。或者,更具体地说,高对比度事物比低对比度事物更模糊。想象一下相机,它可能是数码单反相机或手机或其他任何东西。如果蓝色,无云的天空没有焦点,你能说出来吗?如果一颗星没有焦点,你能说出来吗?
如果你想以某种方式加权卷积中的像素值,那么你应该复制你的数据并按适当的权重缩放每个像素,并将修改后的数据与你的内核进行卷积。