我试着把一个二维矩阵分成两个向量,这样它们的外积等于原始矩阵。在
使用SVD:
import cv2
import numpy as np
def createDoG(sigma, sigmaRatio=0.5):
size = int(np.ceil(sigma*3))*2+1
kernel1_2D = np.outer(cv2.getGaussianKernel(size, sigma), cv2.getGaussianKernel(size, sigma))
kernel2_2D = np.outer(cv2.getGaussianKernel(size, sigma*sigmaRatio), cv2.getGaussianKernel(size, sigma*sigmaRatio))
return kernel1_2D - kernel2_2D
def decompose(kernel):
U, S, V = np.linalg.svd(kernel)
h1 = U[:,0] * np.sqrt(S[0])
h2 = V[0] * np.sqrt(S[0])
return h1,h2
kernel_DoG = createDoG(1)
h1,h2 = decompose(kernel_DoG)
print("kernel_DoG == h1*h2':", np.isclose(kernel_DoG, np.outer(h1, h2)).all()) #prints False
为什么我不能分解这个矩阵?哪一类矩阵是可分的(分成两个向量)?在
这个应用程序是用来分解一个内核的,所以我可以应用两遍1D卷积来加速。我还尝试了python中的this answer,但没有成功。在
因为它是不可分离的。狗和其他许多果仁是不可分离的。在
所有行都是其他行的缩放版本的内核是可分离的。也就是说,每一行
i
的格式必须是其中
b
是“模型行”,而a[i]
是每行的缩放比例。这看起来有点明显,因为上面的乘法是将列内核a
与行内核b
卷积时得到的结果(并且是问题中的代码使用的外积)。在要知道2D核是否可分离,计算它的rank:秩必须是1。这表示所有行都是彼此的缩放版本。在
作为参考,这里有两种不同的MATLAB解决方案,用于任意维数的核分解:
相关问题 更多 >
编程相关推荐