我有一个名为“cube”的数据立方体。我需要用高斯核对每个2d切片进行卷积。
然而,使用下面的代码,这使用了一个标准化的高斯内核,它稀释了每个切片中较弱的像素。
有没有办法将每个像素高斯除以‘max(高斯)’,以便每个像素相对于像素强度进行卷积?
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))
发布于 2017-11-15 22:05:40
您发布的解决方案已经说明了如何与峰值归一化高斯卷积。从你的评论中,听起来你希望你的“峰值”不受周围数据点的影响。严格地说,这是不可能的-卷积意味着每个像素都被“分散”了。
但是,您可能正在谈论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
发布于 2017-11-25 07:10:03
我相信,你的问题在很高的层次上与内核和卷积有关。
假设你有一些数组的数组;
arr = np.ones((5,5))
你也有一些2D卷积内核
kernel = [[0,0,0],
[0,1,0],
[0,0,0]]
在本例中,它是标识内核,所以如果执行conv(arr,kernel)
,应该会返回arr。
如果我们把内核改成1D盒模糊内核会怎么样?
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的单位能量的卷积核。
图像中的总能量(所有值的总和)将随未归一化或单位峰值内核而变化。如果你与一个单位能量核进行卷积,图像中的总能量在前后保持不变。
要解决您的意见,请执行以下操作:
有没有办法将每个像素的高斯除以“最大(高斯)”,这样每个像素就可以相对于像素强度进行卷积?
如果你想要的行为是让明亮的东西(星星)比黑暗的东西(背景)变得更模糊,这是很自然的。或者,更具体地说,高对比度的东西比低对比度的东西更模糊。想象一下一台相机,它可以是单反,也可以是你的手机或其他任何东西。如果蓝蓝的,万里无云的天空是模糊的,你能看出来吗?如果一颗星失焦了,你能看出来吗?
如果您想以某种方式加权卷积中的像素值,那么您应该复制数据,并按适当的权重缩放每个像素,然后将修改后的数据与内核进行卷积。
https://stackoverflow.com/questions/47289559
复制相似问题