在 Gabor 过滤器上应用奇异值分解
信息处理
图像处理
matlab
过滤
加博
2022-02-09 07:06:53
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);
使用u、s和v,您可以使用图像实现卷积:
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));
但是我认为这种方法不如您的可分离方法f和g方法。
其它你可能感兴趣的问题

