%之前写的一个程序,这里面用Sobel算子和Prewitt算子的部分就是对图像锐化得到边缘的了。也可以直接用matlab自带的函数S = edge(I, 'sobel');进行锐化。
clc;close all;
clear all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%读入图像
f=imread('Pictures/4_m03tif');
%f=imread('Pictures/5_m01tif');
%f=imread('Pictures/10_m02tif');
%f=imread('Pictures/22_m03tif');
f=imresize(f,025);
f=im2double(f);
[m,n]=size(f);
subplot(2,3,1),imshow(f);
title('原始图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%生成高斯平滑滤波模板
hg=zeros(3,3); %设定模板大小33
delta=05;
for x=1:1:3
for y=1:1:3
u=x-2;
v=y-2;
hg(x,y)=exp(-(u^2+v^2)/(2pidelta^2));
end
end
h=hg/sum(hg(:));
%高斯滤波
ftemp=zeros(m,n);
rowhigh=m-1;
colhigh=n-1;
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
A=hmod;
ftemp(x,y)=sum(A(:));
end
end
f=ftemp;
subplot(2,3,4),imshow(f);
title('高斯滤波后的图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用Sobel算子进行边缘检测
sx=[-1 0 1;-2 0 2;-1 0 1];
sy=[-1 -2 -1;0 0 0;1 2 1];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sxmod;
fsy=symod;
ftemp(x,y)=max((abs(sum(fsx(:)))),(abs(sum(fsy(:)))));
end
end
fs=im2uint8(ftemp);
subplot(2,3,2),imshow(fs);
title('Sobel算子进行边缘检测的原始图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%阈值分割
TH1=140; %设定阈值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH1)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH1)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
subplot(2,3,5),imshow(fs);
title('Sobel算子边缘检测并细化后的图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%利用Prewitt算子进行边缘检测
sx=[1 0 -1;1 0 -1;1 0 -1];
sy=[-1 -1 -1;0 0 0;1 1 1];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sxmod;
fsy=symod;
ftemp(x,y)=max((abs(sum(fsx(:)))),(abs(sum(fsy(:)))));
end
end
fs=im2uint8(ftemp);
subplot(2,3,3),imshow(fs);
title('Prewitt算子进行边缘检测的原始图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%阈值分割
TH1=100; %设定阈值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH1)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH1)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
subplot(2,3,6),imshow(fs);
title('Prewitt算子边缘检测并细化后的图像');
用matlab数值滤波去除波形毛刺的方法:
1)毛刺不是特别大,可是使用滑动平均窗滤波;
2)用cftool工具箱拟合数据;
3)用神经网络做个函数拟合。
matlab简介:
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
1限幅滤波算法(程序判断滤波算法)
方法解析:
根据经验判断,确定两次采样允许的最大偏差值(设定为A),每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效,
如果本次值与上次值只差>A,则本次值无效,放弃本次值,用上次值代替本次值。
优点:
能有效克服因偶然因素引起的脉冲干扰
缺点:
无法抑制那种周期性的干扰,平滑度差
[cpp] view plain copy
#define A 10
char value;
char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
return new_value;
}
2中位值滤波法
方法解析:
连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值
优点:
能有效克服因偶然因素引起的波动干扰,对温度,液位的变化缓慢的被测参数有良好的滤波效果
缺点:
对流量,速度等快速变化的参数不宜
[cpp] view plain copy
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
3算术平均滤波
方法解析:
连续取N个采样值进行平均运算,N值较大时:信号平滑度较高,但灵敏度较低
N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般12左右。
优点:
适应于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
缺点:
对于测量速度较慢或要求数据计算速度较快的实时控制并不适用,比较浪费RAM
[cpp] view plain copy
#define N 12
char filter()
{
int sum = 0;
for ( count=0;count<N;count++)
{
sum + = get_ad();
delay();
}
return (char)(sum/N);
4递推平均滤波(滑动平均滤波法)方法解析:
把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出)。
把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。N值的选取:一般12
优点:
对周期性干扰有良好的抑制作用,平滑度高,适应于高频振荡的系统
缺点:
灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差。不易消除由于脉冲干扰所引起打的采样值偏差,不适用于脉冲干扰比较严重的场合
浪费RAM
[cpp] view plain copy
#define N 12
char value_buf[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buf[i++] = get_ad();
if ( i == N ) i = 0;
for ( count=0;count<N,count++)
sum = value_buf[count];
return (char)(sum/N);
}
5中位值平均滤波法(防脉冲干扰平均滤波法)
方法解析:
相当于中位值滤波+算术平均滤波,连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。
N值的选取:3-14
优点:融合了两种滤波法的优点
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
缺点:
测量速度较慢,和算法平均滤波一样,浪费RAM。
[cpp] view plain copy
#define N 12
char filter()
{
char count,i,j;
char value_buf[N];
int sum=0,temp=0;
for (count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
for(count=1;count<N-1;count++)
sum += value[count];
return (char)(sum/(N-2));
}
6一阶滞后滤波法
方法解析:
取a=0-1
本次滤波结果=(1-a)本次采样值+a上次滤波结果
优点:
对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合
缺点:
相位滞后,灵敏度低,滞后程度取决于a值的大小,不能消除滤波频率高于采样频率的1/2的干扰信号
[cpp] view plain copy
#define a 50
char value;
char filter()
{
char new_value;
new_value = get_ad();
return (100-a)value + anew_value;
}
7加权递推平均滤波法
方法解析:
是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
通常是,越接近现时刻的数据,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。
优点:
适用于有较大纯滞后时间常数的对象,和采样周期较短的系统
缺点:
对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差。
[cpp] view plain copy
#define N 12
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[N];
int sum=0;
for (count=0,count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (count=0,count<N;count++)
sum += value_buf[count]coe[count];
return (char)(sum/sum_coe);
}
8消抖滤波法
方法解析:
设置一个滤波计数器,将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零,如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器
优点:
对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。
缺点:
对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统
[cpp] view plain copy
#define N 12
char filter()
{
char count=0;
char new_value;
new_value = get_ad();
while (value !=new_value);
{
count++;
if (count>=N) return new_value;
delay();
new_value = get_ad();
}
return value;
}
10低通数字滤波
解析:
低通滤波也称一阶滞后滤波,方法是第N次采样后滤波结果输出值是(1-a)乘第N次采样值加a乘上次滤波结果输出值。可见a<<1。
该方法适用于变化过程比较慢的参数的滤波的C程序函数如下:
[cpp] view plain copy
float low_filter(float low_buf[])
{
float sample_value;
float X=001;
sample_value=(1_X)low_buf[1]+Xlow buf[0];
retrun(sample_value);
}
简介
巴特沃斯滤波器是电子滤波器的一种。巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑。这种滤波器最先由英国工程师斯替芬·巴特沃斯(Stephen Butterworth)在1930年发表在英国《无线电工程》期刊的一篇论文中提出的。巴特沃斯滤波器的特性巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。在振幅的对数对角频率的波得图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向负无穷大。利用巴特沃斯(Butterworth)低通滤波器对受噪声干扰的图像进行平滑处理。
实例% By lyqmath
% DLUT School of Mathematical Sciences 2008
% BLOG: >
介绍了采用TI公司的高速DSP芯片TMS320VC5402的指纹识别系统的预处理算法和编程实现。算法实现采用的DSP集成开发环境(IDE)为CCS 22。通过采用极值滤波、平滑滤波、拉普拉斯锐化、二值化等对指纹图像进行预处理,取得了良好的试验结果。
利用生物认证技术取代传统的使用钥匙、身份z、密码等方法进行个人身份鉴定,可广泛应用于银行、机场、公安等领域的出入管理。将信息技术与生物技术相结合的生物认证技术是本世纪最有发展潜力的技术之一,而指纹识别技术则是其中非常有前景的一种。
数字信号处理器(DSP)是指以数值计算的方法对数字信号进行处理的芯片。它具有处理速度快、灵活、精确、抗干扰能力强、体积小、使用方便等优点。DSP应用于指纹识别已经成为一个新的科技领域和独立的学科体系,当前已形成了有潜力的产业和市场。
本文选定100MHz DSP TMS320VC5402作为指纹信号的处理器,利用其流水线编码的 *** 作特点,并结合指纹识别技术,实现基于DSP CCS22的指纹识别预处理系统。CCS 22(Code Composer Studio)是一种针对标准TMS320调试接口的集成开发环境(IDE),由TI公司于1999年推出。指纹识别的处理流程如图1所示。
指纹处理过程可分为三个阶段:
(1) 获取原始指纹图像,进行预处理;
(2) 提取指纹特征点;
(3) 指纹识别分析判断。
在上述三个阶段中,指纹图像的预处理阶段尤为重要,该阶段对图像处理的好坏直接关系到后面两个阶段工作的开展。本文结合TMS320VC5402的特点,重点研究指纹识别的预处理算法及其DSP实现问题,其中包括指纹的极值滤波、平滑滤波、拉普拉斯锐化、迭代二值化和该算法在DSP开发平台CCS22的C5000上的仿真实现。这一问题的解决,可为未来指纹识别系统的脱机应用提供很有价值的参考。
1 指纹识别预处理算法
指纹识别预处理的目的是使指纹图像更清晰,边缘更明显,以便提取指纹的特征点进行识别。本文采取极值滤波和改进的平滑滤波进行噪声消除,使图像不失真;采取拉普拉斯锐化对指纹进行纹线增强,突出边缘信息,为自适应阀值的迭代二值化提供方便。
11 极值滤波
解梅、马争[1]认为极值滤波器的设计是基于这样一种理念:在指纹图像的采集过程中,指纹图像所受到的冲击性噪声表现为一些斑点或亮点。在一般情况下,可以认为绝大数冲击性噪声是被真实的灰度值所包围。同时噪声污染的像素要远远小于真实灰度值的像素。因此在噪声的消除过程中,无需对大多数没有被噪声污染的像素进行改变处理,只需对那些被污染的像素进行“真实值”代替处理,而这些值的确定可通过图像像素邻域的相关性来确定。
指纹处理过程可分为三个阶段:
(1) 获取原始指纹图像,进行预处理;
(2) 提取指纹特征点;
(3) 指纹识别分析判断。
在上述三个阶段中,指纹图像的预处理阶段尤为重要,该阶段对图像处理的好坏直接关系到后面两个阶段工作的开展。本文结合TMS320VC5402的特点,重点研究指纹识别的预处理算法及其DSP实现问题,其中包括指纹的极值滤波、平滑滤波、拉普拉斯锐化、迭代二值化和该算法在DSP开发平台CCS22的C5000上的仿真实现。这一问题的解决,可为未来指纹识别系统的脱机应用提供很有价值的参考。
1 指纹识别预处理算法
指纹识别预处理的目的是使指纹图像更清晰,边缘更明显,以便提取指纹的特征点进行识别。本文采取极值滤波和改进的平滑滤波进行噪声消除,使图像不失真;采取拉普拉斯锐化对指纹进行纹线增强,突出边缘信息,为自适应阀值的迭代二值化提供方便。
11 极值滤波
解梅、马争[1]认为极值滤波器的设计是基于这样一种理念:在指纹图像的采集过程中,指纹图像所受到的冲击性噪声表现为一些斑点或亮点。在一般情况下,可以认为绝大数冲击性噪声是被真实的灰度值所包围。同时噪声污染的像素要远远小于真实灰度值的像素。因此在噪声的消除过程中,无需对大多数没有被噪声污染的像素进行改变处理,只需对那些被污染的像素进行“真实值”代替处理,而这些值的确定可通过图像像素邻域的相关性来确定。
设有一待处理器像素为s0,其周围8邻域像素排列为
取邻域相关像素的均值为Ai,i∈{1,2,8},并以四个像素为一组处理单元,则改进的极值滤波[1]算法可表述如下:
如果A0>max(Ai),i∈{1,2,8},则
如果A0 < min(Ai), i∈{1,2,8}, 则
s1=s2=s4=s0=min(A1,A2,A4)
s2=s3=s5=s0=min(A2,A3,A5)
s4=s6=s7=s0=min(A4,A6,A7) (3)
s5=s7=s8=s0=min(A5,A7,A8)
如果min(Ai)≤Ai≤max(Ai),i∈{1,2,8},则将像素原值输出,不作处理。
实验结果表明,该方法能得到与中值滤波类似的效果,达到了初步去除噪声的目的。
12 平滑滤波
经过上面的极值滤波处理之后,图像传输过程中所形成的大多数冲击性噪声均被除去,但指纹图像中还存在着随机噪声,需进一步对图像进行平滑处理。本文采取两次平滑滤波,一次是在极值滤波之后,一次是在锐化滤波之后。改进的平滑卷积核为
系数取1/15而非原来的1/17的原因在于提高图像的对比度;而卷积核中心像素加权系数取为5是为了突出该点像素。实验结果表明,该改进是可行的,有利于突出中心像素并有效去除随机噪声。
13 锐化滤波
对于由于积分运算所造成的模糊图像,有必要对其模糊进行校正,进而增强指纹图像的边界。具体做法为增强指纹脊线与谷的对比度。这种增强指纹图像的高频成分,使其边缘清晰的方法称为锐化。因此,锐化的目的在于使经过平均或积分运算后变得模糊的图像的边缘和轮廓变得清晰,并使细节清晰[2]。在本文中,锐化卷积核采用拉普拉斯算子[3]:
通过该卷积核对图像进行卷积预算,能实现高通滤波,进而得到锐化后的指纹脊线。
1.4 迭代阀值二值化
指纹图像经过极值滤波、平滑滤波、拉普拉斯锐化滤波、平滑滤波后,大多数噪声都已被消除,这就为特征点提取提供了基础。为了提取特征点,需对指纹图像进行分割。本文采取迭代阀值的方法对指纹图像进行阀值分割。在图像处理中,反复地用一种运算直至条件满足而得到输出图像的方法称为迭代。迭代阀值方法如下:
①设定初始灰度阀值T(如令T=127),把指纹图像的灰度值分为两组R1和R2。
②计算两组的平均灰度值u1和u2。
③重新设定新的灰度阀值T。新的T定义为:T=(u1+u2)/2。
④依据新的T对指纹图像进行阀值分割。
这种方法是以自适应的阀值对指纹图像进行二值化处理。实验结果表明,该方法比设定固定阀值进行处理更有普遍意义,且行之有效。
2 指纹图像在CCS 22上的输入与输出
在设计中,采用DSP集成开发环境CCS22对指纹识别算法进行模拟验证。用指纹成像系统采集一幅bmp格式指纹图像,如fingerbmp指纹图像。在该指纹图像的数据上面添加一个COFF文件的文件头。以文件名fingerout保存。out文件为TI的公共目标文件。利用CCS中的File-Load Data 可以将fingerout的指纹图像放到DSP的相应内存中去,本次设计中将fingerout存放于DSP的数据存储空间。利用CCS中的Image菜单,通过设置相关选项可以观察处理前的图像与处理后的图像。
3 实际指纹图像预处理效果
依据上述指纹识别预处理算法,通过CCS22的模拟功能,实现了指纹识别预处理的DSP处理,达到了DSP处理指纹图像的应用目的。结果如图2所示。
图2 实际指纹预处理结果
本文针对TMS320VC5402 DSP的快速、高效的特点,采取了DSP集成开发环境CCS22对指纹图像进行预处理。在指纹的预处理中,由于DSP具有10ns指令周期,使采用改进的极值滤波和改进的卷积核平滑滤波对指纹图像进行一次、二次平滑实时处理成为可能。实验结果表明,该方法能有效地处理指纹图像的冲击性噪声和随机噪声。而迭代二值化的运算充分利用了DSP 五级流水线 *** 作,达到了利用DSP对指纹图像进行预处理的应用目的。
以上就是关于matlab中图像锐化程序怎么写,简单点,最好有注释。全部的内容,包括:matlab中图像锐化程序怎么写,简单点,最好有注释。、用matlab如何去除波形毛刺,滤波、如何用delphi编程实现低通滤波等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)