基于DSP的图像中值滤波处理

——(完整工程文件到我的资源下载)

1.图像中值滤波的背景和意义

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

由于成像系统、传输介质和记录设备等的不完善,数字图像在其形成、传输记录过程中往往会受到多种噪声的污染。另外, 在图像处理的某些环节当输入的像对象并不如预想时也会在结果图像中引入噪声。这些噪声在图像上常表现为一引起较强视觉效果的孤立象素点或象素块。一般,噪 声信号与要研究的对象不相关它以无用的信息形式出现,扰乱图像的可观测信息。对于数字图像信号,噪声表为或大或小的极值,这些极值通过加减作用于图像象素的真实灰度值上,在图像造成亮、暗点干扰,极大降低了图像质量,影响图像复原、分割、特征提取、图识别等后继工作的进行。要构造一种有效抑制噪声的滤波机必须考虑两个基本问题能有效地去除目标和背景中的噪声;同时,能很好地护图像目标的形状、大小及特定的几何和拓扑结构特征

中值滤波由Turky在1971年提出,最初用于时间序列分析,后来被用于图像处理,并在去噪复原中取得了较好的效果。中值滤波器是基于次序统计完成信号恢复的一种典型的非线性滤波器,其基本原理是把图像或序列中心点位置的值用该域的中值替代,具有运算简单、速度快、除噪效果好等优点,曾被认为是非线性滤波的代表。然而,一方面中值滤波因不具有平均作用,在滤除诸如高斯噪声时会严重损失信号的高频信息,使图像的边缘等细节模糊;另一方面中值滤波的滤波效果常受到噪声强度以及滤波窗口的大小和形状等因素的制约,为了使中值滤波器具有更好的细节保护特性及适应性,人们提出了许多中值滤波器的改进算法

标准中值滤波算法的基本思想是将滤波窗口内的最大值和最小值均视为噪声,用滤波窗口内的中值代替窗口中心像素点的灰度,在一定程度上抑制了噪声。实际上在一定邻域范围内具有最大或最小灰度值这一特性的,除了噪声点,还包括图像中的边缘点、线性特征点等。中值滤波以此作为图像滤波依据,其滤波结果不可避免地会破坏图像的线段、锐角等信息。因此,要找到一种既能实现有效滤除噪声,又能完整保留图像细节的滤波机制,仅考虑噪声的灰度特性是难以实现的。

2.中值滤波的原理方法

中值滤波是一种非线性平滑技术,它将每一个像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。 

其定义如下:

若有序列x(1),x(2),x(3)……x(n-1),x(n)。n为奇数时,y=x(k),k=(n+1)/2。

n为偶数时,y=x(k1)+x(k2),k1=n/2,k2=k1+1。

应用举例:

3*3的模板,对9个数排序,取第5个数替代原来的像素值。以某一个像素点为中心,选取一个3*3的窗口为模版,如图11-2-3:模版中的灰度值依次为{2,1,4,2,2,3,7,6,8},排序后新的灰度值为{1,2,2,2,3,4,6,7,8},第五个数3为排序后的中值,用3取代原来的中心值2,完成中值滤波过程。


算法实现步骤及流程图

实现步骤:

1选择一个(2n+1)×(2n+1)的窗口(通常为3×3或5×5),并用该窗口沿图像数据进行行或列方向的移位滑动;

2 每次移动后,对窗内的诸像素灰度值进行排序;

3 用排序所得中值替代窗口中心位置的原始像素灰度值。

流程图:


3.实验的C语言实现代码

/*========  头文件引用===========*/

#include "stdio.h"

#include "math.h"

/*============= 工作变量定义======*/

unsigned char *pr_n;    //指针定义

unsigned char *pr_s;    //指针定义

//说明:定义数据存放变量

#pragma        DATA_SECTION(IMG,"data"); 

int  IMG[30000];

#pragma        DATA_SECTION(Noise_IMG,"data");

unsigned char  Noise_IMG[30000];

#pragma        DATA_SECTION(Smooth_IMG,"data");

unsigned char  Smooth_IMG[30000];

void  Medel_Smooth();

///

//使用说明:

//   1. 本程序可以在Simulator下运动;

//   2. 程序编译、链接、加载成功后,先

//      执行File/data/load,将要进行处理的图像数据从Gray_Lenal160x160.dat 

//     (说明:*.dat格式,内部存放了某图像各像素的灰度值)加载入数据存储器存储地址Noise_IMG中

//   3. 数据加载成功后,再Debug/Go Main, 一步一步运行程序

///

/*================= 主程序 ================*/

main()

{   

long n;

int imgH,imgW;

    int *ptr;

    imgH=160;  //图像高与宽,因为数据文件中的图像是160X160像素的

    imgW=160; 

/*=========== 初始化 ==========*/

    //1 把图像数据从IMG中移到Noise_IMG数组中

    ptr=IMG;

    pr_n=Noise_IMG;

    for (n=0;n<imgH*imgW;n++)

       *pr_n++=*ptr++;

    //说明:在此暂停,可看到噪声图像 

//指针指向数组

pr_n=Noise_IMG;

pr_s=Smooth_IMG;

    //2 调用子程序,进行彩色图像变换成灰度图像

    while (1)

    { 

       

       Medel_Smooth(pr_n,pr_s,imgW,imgH);

       //说明:上面子程序执行后,在此暂停,可看平滑后的图像 

     }

    //说明:在此暂停,可看变换后的灰度图像 

}

/*============== 子程序 =============*/

void Medel_Smooth

(   unsigned char *sourceImg,     //原始图像              

unsigned char *newImg,       //输出:中值滤波后图像      

int cols, int rows           //图像的宽度与高度     /* 图像的宽度与高度            */

)

{     //定义局部变量      

int i,j,k,m,r,range=32;     

  int pixels;      

  unsigned char *pp=sourceImg, *newpp=newImg;       

  int medianWin[9]={0};      

  int temp; 

   for (i=0; i< cols -1; i++)                                       

   *newpp++ = *pp++;   

    pp  =  sourceImg + (rows-1)* cols;           

      newpp =  newImg+ (rows-1)* cols;                

      for (i=0; i< cols -1; i++)        

      *newpp++ = *pp++;   

         newpp  =  newImg;                          

           pp     =  sourceImg;               

            for (i=0; i< rows -1; i++)        

            {           *newpp = *pp;            

             newpp+=cols; pp+=cols;                 

             }

             newpp  =  newImg+cols-1;       

             pp     =  sourceImg+cols-1;

              for (i=0; i< rows -1; i++)  

              {

                  *newpp = *pp; 

                   newpp+=cols; pp+=cols;  

                   }

                    pixels=(cols-2)*(rows-2); 

                    pp=sourceImg+cols+1; 

                    newpp=newImg+cols+1; 

                    for(i=0;i<pixels;i++)

                    {

                    medianWin[0]=*(pp - cols-1);       

                    medianWin[1]=*(pp -cols);       

                    medianWin[2]=*(pp - cols+1);       

                    medianWin[3]=*(pp-1);       

                    medianWin[4]=*pp;       

                    medianWin[5]=*(pp+1);          

                     medianWin[6]=*(pp + cols-1);       

                     medianWin[7]=*(pp + cols);       

                     medianWin[8]=*(pp + cols+1);

                     r=8;

                      for(k=0;k<r;k++,r--)

                    for(m=0;m<r;m++)

                    {

                    {if ( medianWin[m]>medianWin[m+1] )

                    {temp=medianWin[m];             

                    medianWin[m]=medianWin[m+1];             

                    medianWin[m+1]=temp;

                    }

                    }

                    }

                    *newpp=medianWin[4]; //排序后取中间值赋值*newpp     

                    newpp++;                                        

                    pp++; }            }//程序结束

4.实验步骤与结果

1实验设备

1. PC兼容机一台:操作系统为Windows XP (Windows NT、Windows 98、Windows 2000),Windows操作系统的内核如果是NT的英安装相应的补丁程序(如:Windows 2000为Service Pack3,Windows XP为 Service Pack1)。

2. Code Composer Studio 2.2 软件开发环境。

3. TS-DM64x实验箱一台(软件仿真可以不要实验箱)。

2实验步骤

1设置ccs为软件仿真环境

打开setup ccs2,点击clear,选择family为c64xx,platform为simulator,endianness为little,在选择DM642 Device Simulator…点击import,点击save and quit,如下图所示

2. 启动CCS。

双击桌面上CCS 2 ('C6000)图标,运行CCS。

3. 打开工程,编译并运行程序。

打开zhzh.pjt。

4. 运行程序,观察试验结果。

按如下方法观看试验结果:

(1)编译、链接程序:执行菜单Project/Rebuild All,汇编结果在将汇编信息输出窗口中给出。编译后将在Bebug目录中产生一个ImgSmooth.out文件。

(2)加载程序:执行File/Load Program,选择ImgSmooth.out并打开,即将可执行文件加载到DSP软件仿真器simulator中,此时CCS将自动打开一个反汇编窗口。

(3)将RGB彩色图像的数据从dat文件读入到内存:执行File/data/load,将要进行颜色转换的图像数据从Gray_Lenna160x160.dat (说明:*.dat格式,内部存放了某图像各像素的RGB颜色值)文件中加载入到数据存储器,即在弹出的窗口中输入存储地址IMG与数据的长度,如下图所示。


(4)运行程序:执行Debug/Run。为了便于观看试验前后的结果,可以在程序中设置断点,采用单步执行的方法运行程序。

(5)显示平滑前的噪声图像:执行View/Graph/Image,在弹出的对话框中选择颜色类型为RGB,并输入RGB彩色图像三个通道数据的地址,以及图像显示格式(显示几行、每行几像素)等内容,如下图所示。这样,原始的噪声图像如图1所示。

图1

(6)显示平滑后的图像:执行View/Graph/Image,在弹出的对话框中选择颜色类型为RGB,并输入灰度图像据的地址,以及图像显示格式(显示几行、每行几像素)等内容,如下图所示。这样平滑后的图像如图2

图2


(7)按照上述方法加载带有椒盐噪声的图像,并进行中值滤波,观察实验结果。如3图所示


5.实验结果分析与总结

通过实验可以发现中值滤波的优点:对于椒盐噪声的去除效果很好,并且在去除图像噪声的同时,更好的保护图像的边缘信息,从而获得更好的图像去噪效果。对于高斯噪声的滤波效果不是很合适。高斯噪声是图像的每一点都有噪声,噪声的幅度成正态分布,幅度是随机的;椒盐噪声是噪声的幅度大小固定,但是位置不固定,位置是随机的。

对于椒盐噪声,均值滤波不能很好的去除,因为算子区域内的均值不为0,而中值滤波可以很好的去除,因为噪声点可能被其他点代替了。
对于高斯噪声,中值滤波不能很好的去除,因为算子区域中都是噪声点,但是均值滤波可以很好的去除,因为正态分布的均值为0。

缺点是因为要对邻域窗口内的像素灰度值进行排序和取中值,需要进行大量的数学运算,而且在图像边缘区域还会保留一定的残留噪声。 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值