• 图像处理之均值滤波介绍及C算法实现


    均值滤波介绍

          滤波是滤波是将信号中特定波段频率滤除的操作,是从含有干扰的接收信号中提取有用信号的一种技术。

         均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(如3×3模板:以目标象素为中心的周围8个象素,构成一个滤波模板,即去掉目标象素本身),再用模板中的全体像素的平均值来代替原来像素值。

          均值滤波效果:平滑线性滤波处理降低了图像的“尖锐”变化。由于典型的随机噪声由灰度级的急剧变化组成,因此常见的平滑处理的应用就是降低噪声。均值滤波器的主要应用是去除图像中的不相关细节,其中“不相关”是指与滤波器模板尺寸相比较小的像素区域。然而,由于图像的边缘也是由图像灰度的尖锐变化带来的特性,所以均值滤波处理还是存在着边缘模糊的负面效应。

    均值滤波算法实现(C语言) 

      1 // junzhilvbo.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "stdlib.h"
      6 #include "string.h"
      7 
      8 #define DATA_X 256      //数字图像水平像素个数
      9 #define DATA_Y 256      //数字图像竖直像素个数
     10 
     11 void OpenFile(const char *cFilePath , int nOriginalData[DATA_Y][DATA_X])
     12 {
     13     printf("正在获取数据......
    ");
     14     FILE *fp ;
     15     fp = fopen(cFilePath , "r");
     16     if(NULL == fp)
     17     {
     18         printf("open file failed! 
    ");
     19         return ;
     20     }
     21 
     22     unsigned char *pData = (unsigned char *)malloc(sizeof(unsigned char)*DATA_X*DATA_Y);
     23     if(NULL == pData)
     24     {
     25         printf("memory malloc failed!
    ");
     26         return ;
     27     }
     28 
     29     fread(pData , sizeof(unsigned char)*DATA_X*DATA_Y , 1 , fp);
     30 
     31     int count_x = 0 ;
     32     int count_y = 0 ;
     33 
     34     for(;count_y < DATA_Y ; count_y++)
     35     {
     36         for(; count_x < DATA_X ;count_x++)
     37         {
     38             nOriginalData[count_y][count_x] = pData[count_y*DATA_Y+count_x];
     39         }
     40     }
     41 
     42     free(pData);
     43     fclose(fp);    
     44 
     45     return ;
     46 }
     47 
     48 void SaveFile(const char *cFilePath , int nResultData[DATA_Y][DATA_X])
     49 {
     50     printf("正在保存数据......
    ");
     51     int count_x,count_y;
     52 
     53     FILE *fp ;
     54     fp = fopen(cFilePath , "w");
     55     if(NULL == fp)
     56     {
     57         printf("open file failed! 
    ");
     58         return ;
     59     }
     60 
     61     for(count_y=0;count_y<DATA_Y;count_y++) 
     62     {
     63         for(count_x=0;count_x<DATA_X;count_x++)          
     64         {
     65             fwrite(&nResultData[count_y][count_x],1,1,fp);
     66         }
     67     }
     68         
     69     fclose(fp);    
     70     printf("文件保存成功! 
    ");
     71 
     72     return ;
     73 }
     74 
     75 bool JunZhiLvBo(const int nOriginalData[DATA_Y][DATA_X], int nResultData[DATA_Y][DATA_X])
     76 {
     77     printf("正在进行均值滤波......
    ");
     78     int count_x ,count_y ;
     79     
     80     /*3*3模版滤波计算,不计算边缘像素*/
     81     for(count_y = 1 ; count_y < DATA_Y ; count_y++)
     82     {
     83         for(count_x = 1 ; count_x < DATA_X ;count_x++)
     84         {
     85             nResultData[count_y][count_x] = (int)((nOriginalData[count_y-1][count_x-1]+
     86                                                    nOriginalData[count_y-1][count_x]  +
     87                                                    nOriginalData[count_y-1][count_x+1]+
     88                                                    nOriginalData[count_y][count_x-1]  +
     89                                                    nOriginalData[count_y][count_x]    +
     90                                                    nOriginalData[count_y][count_x+1]  +
     91                                                    nOriginalData[count_y+1][count_x-1]+
     92                                                    nOriginalData[count_y+1][count_x]  +
     93                                                    nOriginalData[count_y+1][count_x+1])/9); 
     94         }
     95     }
     96 
     97     /*对四个边缘直接进行赋值处理*/
     98     for(count_x=0;count_x<DATA_X;count_x++)                                        //水平边缘像素等于原来像素灰度值
     99     {
    100         nResultData[0][count_x]=nOriginalData[0][count_x];
    101         nResultData[DATA_Y-1][count_x]=nOriginalData[DATA_Y-1][count_x];
    102     }
    103     for(count_y=1;count_y<DATA_Y-1;count_y++)                                     //竖直边缘像素等于原来像素灰度值
    104     {
    105         nResultData[count_y][0]=nOriginalData[count_y][0];
    106         nResultData[count_y][DATA_X-1]=nOriginalData[count_y][DATA_X-1];
    107     }
    108 
    109     return true ;
    110 }
    111 
    112 int _tmain(int argc, _TCHAR* argv[])
    113 {
    114     int nOriginalData[DATA_Y][DATA_X]; //保存原始图像灰度值
    115     int nResultData[DATA_Y][DATA_X];   //保存滤波后的灰度值
    116 
    117     memset(nOriginalData,0,sizeof(nOriginalData));  //初始化数组
    118     memset(nResultData,0,sizeof(nResultData));                                     
    119 
    120     char cOpenFilePath[] = "Lena.raw";                                           //图像文件路径
    121 
    122     OpenFile(cOpenFilePath,nOriginalData);                          
    123     
    124     if(!JunZhiLvBo(nOriginalData,nResultData))                                   //滤波计算
    125     {
    126         printf("操作失败!
    ");
    127         return 0;
    128     }
    129 
    130     char cSaveFilePath[] = "Result.raw";                                        //文件保存路径
    131 
    132     SaveFile(cSaveFilePath,nResultData); 
    133 
    134     return 0;
    135 }

    均值滤波算法效果对比

    均值滤波之前:                                均值滤波之后:

     

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/qiqibaby/p/5277739.html
Copyright © 2020-2023  润新知