zoukankan      html  css  js  c++  java
  • 图像的高斯平滑 Hanson

    11.2 图像的高斯平滑

    图像的高斯平滑也是利用邻域平均的思想,对图像进行平滑处理的一种方法。与图像的简单平滑不同的是,图像的高斯平滑中,在对图像邻域进行平均时,不同位置的像素被赋予了不同的权值。本节将对平滑线性滤波器加以归纳,并对高斯平滑算法进行介绍。

     

    11.2.1 平滑线性滤波器

    在图像的简单平滑处理中,算法利用卷积模板逐一处理图像中的每个像素,最终得到处理结果,这一过程可以形象地比作对源图像中的像素一一进行过滤整理,同时进行必要的运算,最后产生结果数据。图像处理中把对像素邻域逐一处理的算法过程称为滤波器。

    平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,因此平滑线性滤波器也被称为均值滤波器,图像的简单平滑就是平滑线性滤波器的一种应用。

    平滑线性滤波器的衰减因子一般选用模板中所有权值的和,这样就可避免处理对图像整体属性的影响。另外,线性滤波器不仅能用于图像的平滑,也可以用于图像的其他增强处理,这些会在后面的章节为大家介绍。

    图11-7显示了两种平滑线性滤波器的模板和衰减因子。

     图像的高斯平滑

    图11-7 线性模板和衰减因子

    图11-7中a所示的模板就是图像的简单平滑模板,它只是对图像邻域进行简单的平均分配,模板中各位置的权值相同因此在处理中认为邻域内各像素对中心像素灰度的影响是等同的,这样的处理方法比较简单,但也存在很多不足,相比之下b所示的模板在图像处理中往往更加重要,模板中不同的权值表示邻域内不同位置的像素在处理中具有不同的重要性。

    11.2.2 高斯平滑的原理

    图像的高斯平滑

    图像的高斯平滑是平滑线性滤波器的另一种应用,与图像的简单平滑不同的是,它在对邻域内像素灰度进行平均时,给予了不同位置像素不同的权值。图11-8显示的是3×3邻域的高斯模板,模板上越是靠近邻域中心的位置,其权值就越高。如此安排权值的意义在于用此模板进行图像平滑时,在对图像细节进行模糊的同时,可以更多地保留图像总体的灰度分布特征。

    相比图像的简单平滑,高斯平滑对高对比度图像的平滑效率较低,在离散型杂点的消除方面,高斯平滑的效果并不理想。然而如果需要在平滑过程中保留源图像的总体特征,高斯平滑就具有很大的优势。图11-9对比了图像的简单平滑和高斯平滑的处理差异,图中a表示一个5×5邻域内的像素灰度,从图中可以看出此邻域内有两处灰度较高的亮点,b为对a进行3×3邻域简单平滑的结果,从b中可以看出,源图像中的两处亮点被连接在一起,失去了源图像的特征,c为对a进行3×3邻域高斯平滑的结果,可以发现c中依然保留着源图像的特征。

     图像的高斯平滑

    图11-9 简单平滑和高斯平滑处理的差异

    高斯平滑不仅能进行3×3邻域的图像平滑处理,也可以对更大范围的邻域进行平滑,高斯模板上的权值是由高斯分布函数确定的,有兴趣的读者可以参考概率论中统计分布部分的内容。

    11.2.3 高斯平滑的算法实现

    考虑图像为灰度图,则图像的简单平滑算法如下:

     

    BYTE** CreatImage(BYTE* image, unsigned int width, unsigned int height, int bt=4);

     

    BYTE GetAsh(BYTE** imageBuf0, int x, int y);

     

    void SetPixelXY(BYTE** imageBuf1, int x, int y, int a);

     

    int TempltExcuteAsh(BYTE** imageBuf0, int w, int h,

    int* templt, int tw, int x, int y);

     

    static void SmoothGaussAsh(BYTE* image0, BYTE* image1, unsigned int w,

    unsigned int h)

    {

       //将图像转化为矩阵形式

       BYTE** imageBuf0 = CreatImage(image0, w, h);

       BYTE** imageBuf1 = CreatImage(image1, w, h);

       //设定模板

       int templt[9]={1,2,1,2,4,2,1,2,1};

       int x,y;

       int a;

       int scale;

       //设定衰减因子

       scale = 16;

       //依次对源图像的每个像素进行处理

       for(y=1; y<h-1; y++)

       {

           for(x=1; x<w-1; x++)

           {

                   //利用高斯模板对邻域进行处理

                   a=TempltExcuteAsh(imageBuf0,w,h,templt,3,x,y);

                   a/= scale;

                   //过限处理

                   a = a>255?255:a;   

                   a = a<0?0:a;

                   SetPixelXY(imageBuf1,x,y,a);

           }

       }

       //清理内存

       free(imageBuf0);

       free(imageBuf1);

    }

    图11-10为灰度图像的高斯平滑结果,其中a为原始图像,b为对原始图像进行3×3邻域高斯平滑处理的结果。

     图像的高斯平滑

    图11-10 灰度图的高斯平滑

    可以将图像的高斯平滑推广到彩色图像的处理,实现如下:

     

    BYTE** CreatImage(BYTE* image, unsigned int width, unsigned int height, int bt=4);

     

    int TempltExcuteCl(BYTE** imageBuf0, int w, int h,

    int* templt, int tw, int x, int y, int cn);

     

    static void SmoothGaussCl(BYTE* image0, BYTE* image1, unsigned int w,

    unsigned int h)

    {

       //将图像转化为矩阵形式

       BYTE** imageBuf0 = CreatImage(image0, w, h);

       BYTE** imageBuf1 = CreatImage(image1, w, h);

       //设定模板

       int templt[9]={1,2,1,2,4,2,1,2,1};

       int x,y,c;

       int a;

       int scale;

       //设定衰减因子

       scale = 16;

       //依次对源图像的每个像素进行处理

       for(y=1; y<h-1; y++)

           for(x=1; x<w-1; x++)

               for(c=0; c<3; c++)

               {

                   //利用高斯模板对邻域进行处理

                   a=TempltExcuteCl(imageBuf0,w,h,templt,3,x,y,c);

                   a/= scale;

                   //过限处理

                   a = a>255?255:a;   

                   a = a<0?0:a;

                   imageBuf1[y][x*4+c]=a;

               }

       //清理内存

       free(imageBuf0);

       free(imageBuf1);

    }

    图11-11为彩色图像的高斯平滑结果,其中a为原始图像,b为对原始图像进行3×3邻域高斯平滑处理的结果。

     图像的高斯平滑

    图11-11 彩色图的高斯平滑

    图像的高斯平滑相比图像的简单平滑,在保留图像全局特征方面做了很大改进,然而在图像除杂点方面效果也同样不理想。通过学习图像的高斯平滑,读者应当开始建立权值的概念,加权平均在后面章节的学习中会经常用到。

  • 相关阅读:
    Hadoop源代码分析
    Java中如何把两个数组合并为一个
    数据库死锁的解决办法
    Java程序中解决数据库超时与死锁
    mysql 死锁检查
    JDBC事务和数据库事务嵌套的讨论 .
    嵌套事务和事务保存点的错误处理
    java string常见操作题
    java基本数据类型包装类
    java string
  • 原文地址:https://www.cnblogs.com/scnucs/p/2287597.html
Copyright © 2011-2022 走看看