声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 995|回复: 7

[编程技巧] 求助关于滤波器的问题

[复制链接]
发表于 2008-5-16 21:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

[ 本帖最后由 mianyang 于 2008-5-16 23:02 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-5-16 21:41 | 显示全部楼层

回复 楼主 的帖子

指标超出了你定义的矩阵维数
 楼主| 发表于 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 编辑 ]
roadcrack5.bmp
发表于 2008-5-17 09:03 | 显示全部楼层
if (abs(Gx(i,j))>eps*100)  %  x的绝对值足够大

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

具体怎么改,你自己调试下
 楼主| 发表于 2008-5-17 09:23 | 显示全部楼层

回复 4楼 的帖子

但原本前面的一段程序是
load woman;
   size=length(x); 可以运行,我就是换了副图就出错了
发表于 2008-5-17 23:12 | 显示全部楼层
  1. clc;clear
  2. X= imread('d:\roadcrack5.bmp');
  3. [mmm,nnn]=size(X);
  4.    
  5. %  多尺度
  6. m=1.0;
  7. delta=2^m;
  8. %  构造高斯函数的偏导
  9. N=20;  %  滤波器长度(需要调整,必须是偶数)
  10. A=-1/sqrt(2*pi);  %  幅度
  11. for index_x=1:N;
  12.     for index_y=1:N;
  13.         x=index_x-(N+1)/2;
  14.         y=index_y-(N+1)/2;
  15.         phi_x(index_x,index_y)=A*(x/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
  16.         phi_y(index_x,index_y)=A*(y/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
  17.     end
  18. end;
  19. phi_x=phi_x/norm(phi_x);  %  能量归一化
  20. phi_y=phi_y/norm(phi_y);  %  能量归一化
  21. %  对图象做行列卷积
  22. Gx=conv2(X,phi_x,'same');
  23. Gy=conv2(X,phi_y,'same');
  24. %  求梯度
  25. Grads=sqrt((Gx.*Gx)+(Gy.*Gy));
  26. %  求幅角(梯度方向)
  27. angle_array=zeros(mmm,nnn);  %  角度
  28. %  遍历
  29. for i=1:mmm
  30.     for j=1:nnn
  31.         if (abs(Gx(i,j))>eps*100)  %  x的绝对值足够大
  32.             p=atan(Gy(i,j)/Gx(i,j))*180/pi;  %  反正切求角度值(1,4象限)
  33.             if (p<0)        %  负的幅角(4象限)
  34.                 p=p+360;
  35.             end;
  36.             if (Gx(i,j)<0 & p>180)     %  2象限的特殊处理
  37.                 p=p-180;
  38.             elseif (Gx(i,j)<0 & p<180) %  3象限的特殊处理
  39.                 p=p+180;
  40.             end
  41.         else  %  90或270度
  42.             p=90;
  43.         end
  44.         angle_array(i,j)=p;  %  幅角赋值
  45.     end
  46. end;
  47. %  找边缘
  48. edge_array=zeros(mmm,nnn);
  49. %  遍历
  50. for i=2:mmm-1
  51.     for j=2:nnn-1
  52.         if ((angle_array(i,j)>=(-22.5) & angle_array(i,j)<=22.5) | ...
  53.             (angle_array(i,j)>=(180-22.5) & angle_array(i,j)<=(180+22.5)))     %  0/180
  54.             if (Grads(i,j)>Grads(i+1,j) & Grads(i,j)>Grads(i-1,j))
  55.                 edge_array(i,j)=Grads(i,j);
  56.             end
  57.         elseif ((angle_array(i,j)>=(90-22.5) & angle_array(i,j)<=(90+22.5)) | ...
  58.                 (angle_array(i,j)>=(270-22.5) & angle_array(i,j)<=(270+22.5))) %  90/270
  59.             if (Grads(i,j)>Grads(i,j+1) & Grads(i,j)>Grads(i,j-1))
  60.                 edge_array(i,j)=Grads(i,j);
  61.             end
  62.         elseif ((angle_array(i,j)>=(45-22.5) & angle_array(i,j)<=(45+22.5)) | ...
  63.                 (angle_array(i,j)>=(225-22.5) & angle_array(i,j)<=(225+22.5))) %  45/225
  64.             if (Grads(i,j)>Grads(i+1,j+1) & Grads(i,j)>Grads(i-1,j-1))
  65.                 edge_array(i,j)=Grads(i,j);
  66.             end
  67.         else  %  135/215
  68.             if (Grads(i,j)>Grads(i+1,j-1) & Grads(i,j)>Grads(i-1,j+1))
  69.                 edge_array(i,j)=Grads(i,j);
  70.             end
  71.         end
  72.     end
  73. end
  74. %  去除伪边缘
  75. MAX_E=max(max(edge_array).');     %  最大幅度值
  76. edge_array=edge_array/MAX_E;      %  最大幅度值
  77. threshold=0.2;                    %  阈值(需要调整)
  78. %  遍历
  79. for m=1:mmm
  80.     for n=1:nnn
  81.         if (edge_array(m,n)>threshold)
  82.             edge_array(m,n)=1;
  83.         else
  84.             edge_array(m,n)=0;
  85.         end
  86.     end
  87. end
  88. %  显示图像和边缘
  89. figure(1)
  90. subplot(1,2,1)
  91. imshow(X)
  92. title('图像')
  93. subplot(1,2,2)
  94. imshow(edge_array)
  95. title('边缘')
复制代码
未命名.JPG

评分

1

查看全部评分

 楼主| 发表于 2008-5-18 22:19 | 显示全部楼层

回复 6楼 的帖子

happy, 非常感谢~~~~~~~!
 楼主| 发表于 2008-5-22 14:02 | 显示全部楼层

回复 6楼 的帖子

happy,这个程序还有个问题,想请教下你,在找边缘遍历那个循环中,对相应幅角上找小波变换模极大值分成了四种情况来讨论,为什么要将相应的角度值加减22.5度?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-1 16:59 , Processed in 0.076126 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表