将二维滤波核分解为一维核

2024-09-22 14:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把一个二维矩阵分成两个向量,这样它们的外积等于原始矩阵。在

使用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,但没有成功。在


Tags: importsizedefnp矩阵h2h1cv2
1条回答
网友
1楼 · 发布于 2024-09-22 14:23:35

Why can't I decompose this matrix?

因为它是不可分离的。狗和其他许多果仁是不可分离的。在

What class of matrices are separable (into two vectors)?

所有行都是其他行的缩放版本的内核是可分离的。也就是说,每一行i的格式必须是

r[i][j] = a[i] * b[j]

其中b是“模型行”,而a[i]是每行的缩放比例。这看起来有点明显,因为上面的乘法是将列内核a与行内核b卷积时得到的结果(并且是问题中的代码使用的外积)。在

要知道2D核是否可分离,计算它的rank:秩必须是1。这表示所有行都是彼此的缩放版本。在

作为参考,这里有两种不同的MATLAB解决方案,用于任意维数的核分解:

相关问题 更多 >