⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (5).txt

📁 这是一个关于小波模极大值用于边缘提取的matlab程序
💻 TXT
字号:
小波模极大值与边缘提取
不做小波很久,陆续接到网友的很多询问,不少信件关于这个话题。本不想花功夫写程序,因为毕竟研究方向是计算电磁学,然对小波的好奇仍是一种抗拒不了的力量。再加上网友的一遍遍不厌其烦的请教,我也就利用半天时间,将这一话题做了一个程序,拿出来分享。

1。什么是模极大值?一般信号的主要信息,由拐点(二阶导数为零的点)确定,而由于噪声的影响,直接求拐点显然困难。于是,我们求一阶导数的模的极大值。

2。什么是小波模极大值?就是先将小波函数和原信号卷积(连续小波变换),然后对结果取模,最后找到极大值。上述步骤,也就等价于:先把某一光滑函数求导(求导后满足积分为零的条件成为小波函数),然后卷积源信号,接着取模,最后发现极大值。

3。图像处理的操作。

a、给定某一尺度,求出二维高斯函数沿x和沿y方向的导数Phi_x,Phi_y。这两个函数就等价于小波函数。

b、用Phi_x,Phi_y分别与图像卷积得到Gx,Gy。

c、求出每一个像素点的梯度大小G=(Gx*Gx+Gy*Gy).^(1/2),用反正切求梯度方向或者称幅角atan(Gy/Gx)。这里,注意的是反正切只能求出一、四象限的角度,其它象限要分别处理。且Gx为一个很小的数值时,也要处理。

d、把求得幅角,分成四种方向。第一种0或180方向(水平),第二种90或270方向(垂直),第三种45或225方向(正对角线),第四种135或315方向(负对角线)。也就是说,看看你求出幅角的大小与上面的哪个方向最接近。

e、依次检测每一个像素点,看看在它对应“幅角最接近的方向上”是否是极大值。如果是,纪录该梯度值。若不是,把梯度值置零。

f、找到记录梯度值中的最大值,然后以该值做归一化。比较每一个像素归一化的梯度值,当该梯度值大于某个阈值的时候,就是真正边缘,否则认为是伪边缘。

4。实际上这个算法和canny算子本质上等价的。让我们再来回顾canny本人经典的原话,来体会边缘提取的目标到底是什么。

a、好的检测性能。不漏检真实边缘,也不把非边缘点作为边缘点检出,使输出的信噪比最大。

b、好的定位性能。检测到的边缘点与实际边缘点位置最近。

c、唯一性。对于单个边缘点仅有一个响应。

沙威(gjsdgjsd)
安徽大学
2007年4月22日 

%  小波模极大值用于边缘提取

%  2007年4月22日 

clc;clear 

%  下载图像
load woman
% X=double(imread('1.bmp'));
SIZE=length(X);  %  图像尺寸
    
%  多尺度
m=1.0;
delta=2^m; 

%  构造高斯函数的偏导
N=20;  %  滤波器长度(需要调整,必须是偶数)
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)=(x/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
        phi_y(index_x,index_y)=(y/delta^2).*exp(-(x.*x+y.*y)/(2*delta^2));
    end
end; 

%  对图象做行列卷积
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('边缘') 

% 进一步的工作,连线...
17:31 | 添加评论 | 发送消息 | 引用通告 (0) | 写入博客 | 计算机与 Internet
评论
添加评论引用通告此博客的引用通告 URL 是:
http://waveletlegend.spaces.live.com/blog/cns!CCD975D66E675A2C!518.trak
引用此项的网络博客
 

 ? 2007 Microsoft 商标 | 隐私声明 | 使用条款 | 报告滥用行为 | 安全帮助中心 | 帐户 | 反馈 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -