【发布时间】:2018-07-07 12:00:49
【问题描述】:
我正在尝试将二维矩阵分成两个向量,以使它们的外积等于原始矩阵。
使用 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,但没有成功。
【问题讨论】:
-
我不认为 DoG 是可分离的(尽管 SVD 应该可以工作并报告几个非零值),但没有什么禁止分离计算两个高斯并减去。