将2D高斯内核分成两个1D内核

时间:2019-09-22 18:16:17

标签: numpy convolution

计算高斯核,并通过查看核的等级检查其是否可分离。

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false

现在,我认为分隔是不正确的。我以以下方式进行操作:

kernel = gaussian_kernel(kernel_size,sigma)
print(kernel)

[[ 0.01054991  0.02267864  0.0292689   0.02267864  0.01054991]
 [ 0.02267864  0.04875119  0.06291796  0.04875119  0.02267864]
 [ 0.0292689   0.06291796  0.0812015   0.06291796  0.0292689 ]
 [ 0.02267864  0.04875119  0.06291796  0.04875119  0.02267864]
 [ 0.01054991  0.02267864  0.0292689   0.02267864  0.01054991]]

 rank = np.linalg.matrix_rank(kernel)

if rank == 1:
    print('The Kernel is separable')
else:
    print('The kernel is not separable')

然后,我将以上两个内核相乘以得到原始内核。但是我没有明白。

 u,s,v = np.linalg.svd(kernel)
 k1 = (u[:,0] * np.sqrt(s[0]))[np.newaxis].T
 k2 = v[:,0] * np.sqrt(s[0]) 

我认为我尝试使用svd进行进一步的分离是不正确的。一些解释会有所帮助。

1 个答案:

答案 0 :(得分:0)

矩阵等级1表示所有行都是零,或者直到缩放为止都是相同的,并且对于列也是如此。它们还可以扩展到等于这两个因素。 因此,您可以使用类似

的方法恢复它们
[XamlCompilation(XamlCompilationOptions.Compile)]
[DesignTimeVisible(true)]
[Category("Appearance")]

请注意,大多数复杂性来自于我尝试对尽可能多的数据求平均。一个简单的方法,但我认为从数值上讲,它不是稳定的方法

I,J = np.unravel_index(np.abs(kernel).argmax(), kernel.shape)
f1 = np.nansum(kernel / (kernel[None,:,J]@kernel),1,keepdims=True)
f2 = np.nansum(kernel / (kernel@kernel[I,:,None]),0,keepdims=True)
scaling = np.sqrt(np.abs(kernel).sum()/np.abs(f1*f2).sum())
f1 *= scaling * np.sign(f1[I,0]) * np.sign(kernel[I,J])
f2 *= scaling * np.sign(f2[0,J])

当然,一旦正确建立索引,您的方法也将起作用:

I,J = np.unravel_index(np.abs(kernel).argmax(), kernel.shape)
f1 = kernel[:,J,None]
f2 = kernel[None,I,:] / kernel[I,J]