均值滤波快速算法_快速均值滤波-程序员宅基地

技术标签: 图像处理  

1.概述

 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪。中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。

 1.1 中值滤波快速算法 

很多人提出了各种中值滤波的快速算法,其共同特点是只考虑滑动窗口中移入和移出的数据,避免了传统算法中因排序所需的大量数据比较,从而较大地提高了速度。本文从另一个角度提出了一种快速算法,考虑的对象是单个滑
动窗内的像素。具体步骤如下:


(1)   X
考虑待处理的窗口内像素为 i={X1,Xc,Xn},加权窗为Wi={W1 W2   Wn} X。对中心像素 c进行比较,将窗口内的像素分为小于、等于和大于Xc3[3],并加上相应权值来统计每一类的个数分别记为Left CenterRight。把小于和大于Xc的像素分别放入数组LEFT[]RIGHT[]。例如X3Left=Left+W3,并加入W3X3到数组LEFT[m] LEFT[m+1] 、直到LEFT[m+ W3-1],m=Left,取下一个像素重复以
上步骤,取完为止。

(2)  比较LeftRight X,如两者相等则中值为中心像素 c
(3)  |Left-Right| r X,则中值为中心像素 c
(4)  |Left-Right|>Cente
r,则分为 Left>Right Right>Left两种情况。 Left>Right为例 , X说明中值在小于 c的这一类中 LEFT[Left] =Left-Right-Center。表示中值就是数组LEFT[Left]中最大的△个数的中值。计算index=( +1)/2.表示中值就是LEFT[Left]中第index
大这个数(Right>Left )情况下分析类似
(5)   
最后对LEFT[Left]RIGHT[Right]进行局部排序,排序到第index个大小时结束。

流程图如下:

均值滤波快速算法

 

2 调试

2. 1 中值滤波快速算法

测试结果:

根据测试,处理同样一副椒盐噪声图像,与一般的中值滤波方法相比,采用3*3的滤波窗口,本文的中值滤波的快速算法在时间上大约可以缩短一半,而对于更大的滤波窗口来说,窗口越大采用本文的方法实验结果越明显。由此可见,本中值滤波在实际应用中可以更为快速的解决问题。

椒盐噪声图像滤波:

均值滤波快速算法

高斯图像滤波:

均值滤波快速算法

CCS代码:

 

#include

#include

#include"IMG_thr_le2min.h"

 

#define IMAGEWIDTH  256

#define IMAGEHEIGHT 256

#define Uint8       unsigned char

 

unsigned char grey[IMAGEHEIGHT][IMAGEWIDTH];

 

void ReadImage(char *cFileName);

void bmpDataPart(FILE* fpbmp);

void fastmiddle();

Uint8 GetMedianLocalSort(Uint8 *array,Uint8 length,Uint8 index,int type);

 

 

void main()

{

 

   ReadImage("D:\\Administrator\\My Pictures\\Lena1.bmp");

 

   fastmiddle();

 

   while (1);                                               

}                                         

 

 

void ReadImage(char *cFileName)

{

 

        FILE *fp;

        if ( fp=fopen(cFileName,"rb" ) )

        {

          

              bmpDataPart(fp);

              fclose(fp);

        }

}

 

void bmpDataPart(FILE* fpbmp)

{

  int i, j=0;

  unsigned char* pix=NULL;

  fseek(fpbmp, 55L, SEEK_SET);

 

  pix=(unsigned char*)malloc(256);

 

  for(j=0;j

   {

    

               fread(pix, 1, 256, fpbmp);

     for(i=0;i

        {

          

                

            grey[IMAGEHEIGHT-1-j][i]   =pix[i];

 

        }

 

    }

 

}

 

 

void fastmiddle()

{

 

 int i=0,j=0;

 int wheight=1,wwidth=1;                   //窗口大小(2*wheight+1) * (2*wwidth+1)

 int k=0,l=0;

 Uint8 left[9],right[9],X;

 Uint8 leftnum=0,rightnum=0,centernum=0,index=0;

 

 for(i=0;i

   {

 

     for(j=0;j

        {

          

            if((i>wheight-1) && (iwwidth-1) && (j

                       

                      {

              

               X=grey[i][j];

               leftnum=0;

               rightnum=0;

               centernum=0;

               index=0;

 

                        for(k=i-wheight;k<=i+wheight;k++)

                         for(l=j-wwidth;l<=j+wwidth;l++)

                          {

                   if(grey[k][l]>X )

                                    {

                                    

                                     left[leftnum] = grey[k][l];

                                     leftnum++;

                                    }

 

                    else if(grey[k][l]

                                    {

                                    

                                    right[rightnum] = grey[k][l];

                                    rightnum++;

                                    }

 

                                    else

                                      centernum++;

 

                  }

 

                if(leftnum == rightnum)

                               continue;//grey[i][j]=X;

                            else

                             if(abs(leftnum-rightnum) < centernum)

                               continue;//grey[i][j]=X;

                            else

                             if(leftnum>rightnum)

                              {

                               index=(leftnum-rightnum-centernum+1)/2;

                   grey[i][j]=GetMedianLocalSort(left,leftnum,index,1);

                              }

                            else   

                  {

                               index=(rightnum-leftnum-centernum+1)/2;

                   grey[i][j]=GetMedianLocalSort(right,rightnum,index,2);

                              }

            

                      }

 

 

        }

 

    }

 

 

}

 

 

Uint8 GetMedianLocalSort(Uint8 *array,Uint8 length,Uint8 index,int type)

{

 int Median=0,i=0,j=0;

 if(type==1)

 {

   for(i=0;i

   {

    for(j=i+1;j

    {

     if(array[i]>array[j])

 

     {

      Median=array[i];

      array[i]=array[j];

      array[j]=Median;

     }

    }

  }

 return array[index-1];

 

 }

 

if(type==2)

 {

   for(i=0;i

   {

     for(j=i+1;j

     {

       if(array[i]

         {

           Median=array[i];

           array[i]=array[j];

           array[j]=Median;

         }

     }

   }

 return array[index-1];

 }

 return -1;

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012045426/article/details/52343655

智能推荐

【小李木耳】出品:一直舍不得丢掉的东西:“一(个)白云、三(个)兔子...” 和“...早日发账”-程序员宅基地

文章浏览阅读841次。 什么是虚拟化3.0时代? 微软公司的云计算服务有哪些? 云计算IDC服务都包括什么? 什么是云计算? 向私有云过渡的步骤有哪些?一直舍不得丢掉的东西:“一(个)白云、三(个)兔子...” 和“...早日发账”(写于2011年12月10日00:17 北京)今天这个话题比较有感觉,就晒一晒我舍不得的两件东西:“一(个)白云、三(个)兔子...” 和“

Unity_用鼠标控制相机旋转、拖拽、视角缩放_unity 相机 平移 拖拽 缩放-程序员宅基地

文章浏览阅读2w次,点赞17次,收藏97次。一、滚轮控制视角缩放 /// &amp;amp;lt;summary&amp;amp;gt; /// 滚轮控制相机视角缩放 /// &amp;amp;lt;/summary&amp;amp;gt; public void CameraFOV() { //获取鼠标滚轮的滑动量 float wheel = Input.GetAxis(&amp;quot;Mouse ScrollWheel&am_unity 相机 平移 拖拽 缩放

精选力扣500题 第22题 LeetCode 88. 合并两个有序数组【c++详细题解】_力扣22 c++-程序员宅基地

文章浏览阅读280次,点赞6次,收藏4次。目录1、题目2、思路13、代码14、思路25、代码21、题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2的元素数量分别为 m 和n。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]_力扣22 c++

php文本框怎么设置好看,一个很不错的CSS改写的大表单文本框和搜索按钮组-程序员宅基地

文章浏览阅读139次。《一个很不错的CSS改写的大表单文本框和搜索按钮组》要点:本文介绍了一个很不错的CSS改写的大表单文本框和搜索按钮组,希望对您有用。如果有疑问,可以联系我们。先看效果图:HTML代码部分:开始爬取CSS部分:/*大搜索框*/.searchInputBox{height:62px;width:810px;margin:0auto;border-radius:6px;background-..._css 好看 文本框

select下拉框启用和禁止-程序员宅基地

文章浏览阅读3.4k次。描述:通过你好来判断hello是否启用和禁止html:<li> <span class="xin">*</span><label>你好</label> <select id="dimAcc"> <option >类似</option> ..._select下拉框启用和禁止

【前端面试--JS】=>关于async/await、promise和setTimeout的执行顺序_js执行顺序console.log('script start') async function a-程序员宅基地

文章浏览阅读988次,点赞29次,收藏21次。前言之前面试遇到这样一个题目。关于async/await、promise和setTimeout的执行顺序,当时没做对。后来查了查是非常经典的题目。也给大家解疑答惑一下,说出自己的理解。题目是看代码写结果。async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end');}async function async2() { console.log('async2_js执行顺序console.log('script start') async function async1() { await async2

随便推点

Vue笔记整理,12.项目-完成tabbar的小图标设置_tab-bar设置图标-程序员宅基地

文章浏览阅读912次。一、前言上一节我们介绍了:vs code工具的一些特殊使用,使用vs code默认集成的Git工具快速提交代码,详细可参考博文:原创Vue笔记整理,11.项目-使用vs code默认集成的Git工具快速提交代码这篇我们将介绍项目-完成tabbar的小图标设置二、完成tabbar的小图标设置更新中。。。..._tab-bar设置图标

D4 - Makefile_d4文件-程序员宅基地

文章浏览阅读109次。第一节 Make与MakefileMake简介Make将只编译改动的代码文件,而不用完全编译Make使用Makefile1:Make只能读取Makefile文件2:Makefile功能包含’由谁生成’可执行文件,‘怎么生成可执行文件’.‘生成什么可执行文件’Makefile格式生成什么:由谁生成 <table> commandMakefile隐含规则第二节 创建与使用变量Make变量(变量必须大写)去""的字符串Make变量为了便_d4文件

Android MVVM(使用经验篇)-程序员宅基地

文章浏览阅读702次。MVVM的大名相信做手机开发的肯定不会陌生,我第一次听到它是从做IOS开发的同学那里听到的,我们的项目之前应用了MVP,要说服大家从MVP到MVVM,肯定得说说为啥,他优秀在那里? 首先我们看看正常MVP的依赖关系图: 这是个经典的MVP依赖关系,View 层和Presenter,Presenter和Model层彼此依..._android mvvm image src

postgresql 日志配置_pg修改log_connections-程序员宅基地

文章浏览阅读4.8k次。PostgreSQL有3种日志,分别是pg_log(数据库运行日志)、pg_xlog(WAL 日志,即重做日志)、pg_clog(事务提交日志,记录的是事务的元数据)pg_log默认是关闭的,需要设置参数启用此日志。pg_xlog和pg_clog都是强制打开的,无法关闭。1.启用pg_log并配置日志参数log_destination = 'csvlog'logging_collector = o..._pg修改log_connections

php逆波兰表达式,我就给一个PHP逆波兰表达式的算法吧---工资计算专用-程序员宅基地

文章浏览阅读62次。有个网友写信给我谈到关于PHP计算工资问题。我以前一篇文章中谈到过一种计算工资的方法,不过是偷巧,利用现有的表达式的工具,现在既然有人想要,我就给出一个逆波兰的算法。 我们的目标是实现如下的计算公式: 假设有一个计算公式如下: $expression = "(F1*F12+10.34)"; 其中的变量值如下: $expression_value = Array('F1'=>10, 'F12'..._php 逆波兰算法 函数

模板类之间的友元关系实现Blob和BlobPtr-程序员宅基地

文章浏览阅读57次。16.12编写你自己版本的Blob和BlobPtr模板,包含书中未定义的多个const成员。Blob.h(注意,成员函数的声明和定义要放在一个头文件中)/*记住,模板的头文件中通常既包括声明也包括定义。函数模板和类模板成员函数的定义通常放在头文件中,不能分开放。。。。谨记*/#ifndef BLOB_H#define BLOB_H#include<iostream&g..._blobptr