这是串行Gabor过滤器的代码。我得到的问题是语句J = J + abc
应该返回最终过滤后的图像作为所有过滤器的叠加,但只显示最后一次迭代的结果:
function [J] = gabor(I)
J = zeros(size(I));
for phi = 5*pi/8:pi/8:pi;
for theta = 1:0.5:2;
for filterSize = 4:6;
sigma = 0.65*theta;
G = zeros(filterSize);
for i=(0:filterSize-1)/filterSize
for j=(0:filterSize-1)/filterSize
xprime= j*cos(phi);
yprime= i*sin(phi);
K = exp(2*pi*theta*sqrt(-1)*(xprime+ yprime));
G(round((i+1)*filterSize),round((j+1)*filterSize)) = exp(-(i^2+j^2)/(sigma^2))*K;
end
end
abc = conv2(double(I),double(G),'same');
J = J + abc;
end
end
end
figure; imshow(J);
end
以下是输出图像的样子:
答案 0 :(得分:1)
我的直觉(或者看起来像......)是你的图像输出类型是double
,而imshow
只显示[0,1]
类double
之间的强度}。任何低于0或高于1的值都会分别饱和到黑色或白色,这就是为什么您的图像输出只显示为黑色或白色。这一点也很明显,因为J
默认为double
类型。尝试为imshow
命令执行此操作,使其拉伸强度以适应[0,1]
范围:
imshow(J, []);
请注意,此不会修改图片。它只会改变图像的可视化方式。此imshow
命令出现在代码的末尾,因此请在此处更改该命令。
顺便说一下,sqrt(-1)
被视为不良形式。请改用1j
或1i
,并更改for
循环索引,以便您不使用i
和j
,因为这些应该用于代表复数。 Shai显示,使用i
和j
作为循环索引会导致性能不佳。您应该为复数保留这些。请查看此帖子了解详情:Using i and j as variables in Matlab
此外,您可能希望对比拉伸图像,使其适合0
和1
。因此,在退出函数之前执行此操作:
J = im2double(J);