mianyang 发表于 2008-5-16 21:31

求助关于滤波器的问题

弱弱的问下:什么是滤波器的长度?我有个程序运行出现??? Index exceeds matrix dimensions.改怎么处理下?

[ 本帖最后由 mianyang 于 2008-5-16 23:02 编辑 ]

sigma665 发表于 2008-5-16 21:41

回复 楼主 的帖子

指标超出了你定义的矩阵维数

mianyang 发表于 2008-5-16 22:59

回复 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 编辑 ]

sigma665 发表于 2008-5-17 09:03

if (abs(Gx(i,j))>eps*100)%x的绝对值足够大

求卷积以后,Gx的长度变短了

具体怎么改,你自己调试下

mianyang 发表于 2008-5-17 09:23

回复 4楼 的帖子

但原本前面的一段程序是
load woman;
   size=length(x); 可以运行,我就是换了副图就出错了

happy 发表于 2008-5-17 23:12

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('边缘')

mianyang 发表于 2008-5-18 22:19

回复 6楼 的帖子

happy, 非常感谢~~~~~~~!

mianyang 发表于 2008-5-22 14:02

回复 6楼 的帖子

happy,这个程序还有个问题,想请教下你,在找边缘遍历那个循环中,对相应幅角上找小波变换模极大值分成了四种情况来讨论,为什么要将相应的角度值加减22.5度?
页: [1]
查看完整版本: 求助关于滤波器的问题