在 Gabor 过滤器上应用奇异值分解

信息处理 图像处理 matlab 过滤 加博
2022-02-09 07:06:53

根据我在此链接中的问题,我应用了(在 lennon310 的大力帮助下)任何方向的 Gabor 滤波器的可分离性。这种方法的唯一缺点是复杂域中的卷积。因此,我们可以将 Gabor 滤波器G(x,y)视为具有低秩的二维矩阵,因为该滤波器在较低频率下相当平滑。然后可以使用奇异值分解来将过滤器分解为实数可分离过滤器的线性和。

在此处输入图像描述

这里, ui,vi是正交矩阵 的列U,Vs_i是奇异值。G(x, y)滤波器与图像的卷积I(x, y)现在可以使用以下方法进行近似: 在此处输入图像描述

我需要有关如何在此链接中编辑我的代码以便在 MATLAB 中应用它的帮助。任何帮助将不胜感激。

2个回答

最终代码将是:

for i = -filtSizeL:filtSizeR
            for j = -filtSizeL:filtSizeR

                if ( sqrt(i^2+j^2)>filtSize/2 )
                    E = 0;
                else
                    x = i*cos(theta) - j*sin(theta);
                    y = i*sin(theta) + j*cos(theta);

                     %fx = exp(-(i^2)/(2*sigmaq))*exp(sqrt(-1)*i*cos(theta));
                     %gy = exp(-(j^2)/(2*sigmaq))*exp(sqrt(-1)*j*sin(theta));
                     %E=real(fx*gy);

                   E = exp(-(x^2+G^2*y^2)/(2*sigmaq))*cos(2*pi*x/lambda(k));
                end
                f(j+center,i+center) = E;
            end
        end

        f = f - mean(mean(f));
        f = f ./ sqrt(sum(sum(f.^2)));

%%%% SVD %%%%
        [u,s,v]=svd(f);

 convv = zeros(size(image_double));
   for i = 1:filtSizeR+filtSizeL+1
       convv1=imfilter(image_double*s(i,i),  u(i,:),'conv');
        convv2=imfilter(double(convv1),v(:,i)','conv');
        convv = convv + convv2;
    end

    figure
    imagesc(convv);
    colormap(gray);

我不建议您在 Gabor 过滤器中应用 SVD,因为它不会带来太多好处,反而会增加计算负载。如果你实现 SVD,你可能不会首先分离过滤器,而是在2D Gabor 过滤器上执行 SVD :

                for i = -filtSizeL:filtSizeR
                    for j = -filtSizeL:filtSizeR

                        if ( sqrt(i^2+j^2)>filtSize/2 )
                            E = 0;
                        else
                            x = i*cos(theta) - j*sin(theta);
                            y = i*sin(theta) + j*cos(theta);
                            E = exp(-(x^2+G^2*y^2)/(2*sigmaq))*cos(2*pi*x/lambda(k));
                        end
                        f(j+center,i+center) = E;
                    end
                end

               %% SVD %%%%
               [u,s,v]=SVD(f);

使用usv,您可以使用图像实现卷积:

    convv = zeros(size(image_double));
    for i = 1:filtSizeR+filtSizeL+1
        convv1=imfilter(image_double*s(i,i),  u(i,:),'conv');
        convv2=imfilter(double(convv1),v(:,i)','conv');
        convv = convv + convv2;
    end

    figure
    imagesc(imag(convv));

但是我认为这种方法不如您的可分离方法fg方法。