求助关于滤波器的问题
弱弱的问下:什么是滤波器的长度?我有个程序运行出现??? Index exceeds matrix dimensions.改怎么处理下?[ 本帖最后由 mianyang 于 2008-5-16 23:02 编辑 ]
回复 楼主 的帖子
指标超出了你定义的矩阵维数回复 2楼 的帖子
sigma665能帮我看下以下的程序吗?运行一直出现指标超出定义的矩阵维数,方便的话能不能帮我修改下?clc;clear
X= imread('roadcrack5.bmp');
SIZE=length(X);%图像尺寸
%多尺度
m=1.0;
delta=2^m;
%构造高斯函数的偏导
N=20;%滤波器长度(需要调整,必须是偶数)
A=-1/sqrt(2*pi);%幅度
for index_x=1:N;
for index_y=1:N;
x=index_x-(N+1)/2;
y=index_y-(N+1)/2;
phi_x(index_x,index_y)=A*(x/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
phi_y(index_x,index_y)=A*(y/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
end
end;
phi_x=phi_x/norm(phi_x);%能量归一化
phi_y=phi_y/norm(phi_y);%能量归一化
%对图象做行列卷积
Gx=conv2(X,phi_x,'same');
Gy=conv2(X,phi_y,'same');
%求梯度
Grads=sqrt((Gx.*Gx)+(Gy.*Gy));
%求幅角(梯度方向)
angle_array=zeros(SIZE,SIZE);%角度
%遍历
for i=1:SIZE;
for j=1:SIZE
if (abs(Gx(i,j))>eps*100)%x的绝对值足够大
p=atan(Gy(i,j)/Gx(i,j))*180/pi;%反正切求角度值(1,4象限)
if (p<0) %负的幅角(4象限)
p=p+360;
end;
if (Gx(i,j)<0 & p>180) %2象限的特殊处理
p=p-180;
elseif (Gx(i,j)<0 & p<180) %3象限的特殊处理
p=p+180;
end
else%90或270度
p=90;
end
angle_array(i,j)=p;%幅角赋值
end
end;
%找边缘
edge_array=zeros(SIZE,SIZE);
%遍历
for i=2:SIZE-1
for j=2:SIZE-1
if ((angle_array(i,j)>=(-22.5) & angle_array(i,j)<=22.5) | ...
(angle_array(i,j)>=(180-22.5) & angle_array(i,j)<=(180+22.5))) %0/180
if (Grads(i,j)>Grads(i+1,j) & Grads(i,j)>Grads(i-1,j))
edge_array(i,j)=Grads(i,j);
end
elseif ((angle_array(i,j)>=(90-22.5) & angle_array(i,j)<=(90+22.5)) | ...
(angle_array(i,j)>=(270-22.5) & angle_array(i,j)<=(270+22.5))) %90/270
if (Grads(i,j)>Grads(i,j+1) & Grads(i,j)>Grads(i,j-1))
edge_array(i,j)=Grads(i,j);
end
elseif ((angle_array(i,j)>=(45-22.5) & angle_array(i,j)<=(45+22.5)) | ...
(angle_array(i,j)>=(225-22.5) & angle_array(i,j)<=(225+22.5))) %45/225
if (Grads(i,j)>Grads(i+1,j+1) & Grads(i,j)>Grads(i-1,j-1))
edge_array(i,j)=Grads(i,j);
end
else%135/215
if (Grads(i,j)>Grads(i+1,j-1) & Grads(i,j)>Grads(i-1,j+1))
edge_array(i,j)=Grads(i,j);
end
end
end
end
%去除伪边缘
MAX_E=max(max(edge_array).'); %最大幅度值
edge_array=edge_array/MAX_E; %最大幅度值
threshold=0.2; %阈值(需要调整)
%遍历
for m=1:SIZE
for n=1:SIZE
if (edge_array(m,n)>threshold)
edge_array(m,n)=1;
else
edge_array(m,n)=0;
end
end
end
%显示图像和边缘
figure(1)
subplot(1,2,1)
imshow(X,map)
title('图像')
subplot(1,2,2)
imshow(edge_array)
title('边缘')
[ 本帖最后由 mianyang 于 2008-5-16 23:02 编辑 ] if (abs(Gx(i,j))>eps*100)%x的绝对值足够大
求卷积以后,Gx的长度变短了
具体怎么改,你自己调试下
回复 4楼 的帖子
但原本前面的一段程序是load woman;
size=length(x); 可以运行,我就是换了副图就出错了 clc;clear
X= imread('d:\roadcrack5.bmp');
=size(X);
%多尺度
m=1.0;
delta=2^m;
%构造高斯函数的偏导
N=20;%滤波器长度(需要调整,必须是偶数)
A=-1/sqrt(2*pi);%幅度
for index_x=1:N;
for index_y=1:N;
x=index_x-(N+1)/2;
y=index_y-(N+1)/2;
phi_x(index_x,index_y)=A*(x/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
phi_y(index_x,index_y)=A*(y/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
end
end;
phi_x=phi_x/norm(phi_x);%能量归一化
phi_y=phi_y/norm(phi_y);%能量归一化
%对图象做行列卷积
Gx=conv2(X,phi_x,'same');
Gy=conv2(X,phi_y,'same');
%求梯度
Grads=sqrt((Gx.*Gx)+(Gy.*Gy));
%求幅角(梯度方向)
angle_array=zeros(mmm,nnn);%角度
%遍历
for i=1:mmm
for j=1:nnn
if (abs(Gx(i,j))>eps*100)%x的绝对值足够大
p=atan(Gy(i,j)/Gx(i,j))*180/pi;%反正切求角度值(1,4象限)
if (p<0) %负的幅角(4象限)
p=p+360;
end;
if (Gx(i,j)<0 & p>180) %2象限的特殊处理
p=p-180;
elseif (Gx(i,j)<0 & p<180) %3象限的特殊处理
p=p+180;
end
else%90或270度
p=90;
end
angle_array(i,j)=p;%幅角赋值
end
end;
%找边缘
edge_array=zeros(mmm,nnn);
%遍历
for i=2:mmm-1
for j=2:nnn-1
if ((angle_array(i,j)>=(-22.5) & angle_array(i,j)<=22.5) | ...
(angle_array(i,j)>=(180-22.5) & angle_array(i,j)<=(180+22.5))) %0/180
if (Grads(i,j)>Grads(i+1,j) & Grads(i,j)>Grads(i-1,j))
edge_array(i,j)=Grads(i,j);
end
elseif ((angle_array(i,j)>=(90-22.5) & angle_array(i,j)<=(90+22.5)) | ...
(angle_array(i,j)>=(270-22.5) & angle_array(i,j)<=(270+22.5))) %90/270
if (Grads(i,j)>Grads(i,j+1) & Grads(i,j)>Grads(i,j-1))
edge_array(i,j)=Grads(i,j);
end
elseif ((angle_array(i,j)>=(45-22.5) & angle_array(i,j)<=(45+22.5)) | ...
(angle_array(i,j)>=(225-22.5) & angle_array(i,j)<=(225+22.5))) %45/225
if (Grads(i,j)>Grads(i+1,j+1) & Grads(i,j)>Grads(i-1,j-1))
edge_array(i,j)=Grads(i,j);
end
else%135/215
if (Grads(i,j)>Grads(i+1,j-1) & Grads(i,j)>Grads(i-1,j+1))
edge_array(i,j)=Grads(i,j);
end
end
end
end
%去除伪边缘
MAX_E=max(max(edge_array).'); %最大幅度值
edge_array=edge_array/MAX_E; %最大幅度值
threshold=0.2; %阈值(需要调整)
%遍历
for m=1:mmm
for n=1:nnn
if (edge_array(m,n)>threshold)
edge_array(m,n)=1;
else
edge_array(m,n)=0;
end
end
end
%显示图像和边缘
figure(1)
subplot(1,2,1)
imshow(X)
title('图像')
subplot(1,2,2)
imshow(edge_array)
title('边缘')
回复 6楼 的帖子
happy, 非常感谢~~~~~~~!回复 6楼 的帖子
happy,这个程序还有个问题,想请教下你,在找边缘遍历那个循环中,对相应幅角上找小波变换模极大值分成了四种情况来讨论,为什么要将相应的角度值加减22.5度?
页:
[1]