分解 Sobel 滤波器

信息处理 图像处理 线性代数
2022-02-18 03:21:13

我正在尝试使用 Matlab 将 Sobel 滤波器分解为两个向量(列和行)。

如果我们的 Sobel 滤波器是

A = [1 0 -1; 2 0 -2; 1 0 -1]

我们可以在 Matlab 中得到 U、S、V 矩阵

[U, S, V] = svd(A)

哪个返回

U =

   -0.4082    0.9129   -0.0000
   -0.8165   -0.3651   -0.4472
   -0.4082   -0.1826    0.8944


S =

    3.4641         0         0
         0    0.0000         0
         0         0         0


V =

   -0.7071   -0.7071         0
         0         0   -1.0000
    0.7071   -0.7071         0

现在,根据如何分解可分离过滤器?,我们的行向量和列向量应该是

sqrt(3.4641)*u1sqrt(3.464)*v1.'

但是这些操作并没有返回答案,应该是

[1; 2; 1][1 0 -1]

2个回答

可分离滤波器的分解不是唯一的,因为uv=(ua)(va1)

您期望的解决方案是通过使用2因子,即-U(:,1) .* S(1,1) ./ sqrt(2)-sqrt(2)*V(:,1)

SVD 解决方案有点矫枉过正。如果矩阵是两个向量的乘积,则它的秩应为 1(或更低,但那是微不足道的)。因此,矩阵应该至少在行或列上具有不言自明的向量。在这里,由于整数条目,[1,2,1]或者[1,0,1]很容易弹出。一旦选择了一个,另一个就很容易跟随。以下是有关此主题的其他 SE.DSP 帖子:

正如@Bob 已经说过的那样,分解并不是唯一的。为什么不[3,6,3]或者[2,0,2]? 可能是因为一些潜意识的简单概念。这个概念可能很复杂。

实际上,由于舍入误差、浮点数,矩阵很少是一级的,至少在数值上是这样。一点1e17可以打破一级矩阵。因此,仍有一些工作可以适当地判断矩阵是否可分离(wrt 错误),并且该问题可能涉及相当复杂的优化问题,请参阅: Nonconvex Matrix Factorization from Rank-One Measurements或 2021 年预印本Rank-one matrix estimation:梯度下降动力学的解析时间演化