图像处理中滤波方法有哪些_均值滤波、中值滤波、高斯滤波 图像处理函数的适用图像 - CSDN
  • 数字图像处理------中值滤波

    千次阅读 2016-09-20 14:02:04
    一 中值滤波概念  中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该...如:以3*3的领域为例求中值滤波中像素5的值    图1 1)int pixel[9]中存储像素1,像素2...像
    一 中值滤波概念
    

         中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1];

    如:以3*3的领域为例求中值滤波中像素5的值

     

                                                                             图1

    1)int pixel[9]中存储像素1,像素2...像素9的值;

    2)对数组pixel[9]进行排序操作;

    3)像素5的值即为数组pixel[9]的中值pixel[4]。

        中值滤波对处理椒盐噪声非常有效。

    二 中值滤波代码实现

    项目工程:https://github.com/ranjiewwen/Everyday_Practice/tree/master/MedianFilter/MedianFilter/MedianFilter

    //中值滤波:本算法采用3*3的领域范围
    void MyImage::MedianFilterOper()
    {
        //0. 准备:获取图片的宽,高和像素信息,
        int const num = 3 * 3;
        unsigned char pixel[num] = { 0 }; //保存领域的像素值
        int width = m_bmpInfo.biWidth;
        int height = m_bmpInfo.biHeight;
        int widthbyte = (width * m_bmpInfo.biBitCount / 8 + 3) / 4 * 4;  //保证为4的倍数
        //相对于中心点,3*3领域中的点需要偏移的位置
        int delta[3 * 3][2] = {
            { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 0 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, {1, 1}
        };    
        //1. 中值滤波,没有考虑边缘
        for (int i = 1; i < height-1; ++i)
        {
            for (int j = 1; j < widthbyte-1; ++j)
            {
                //1.1 提取领域值
                for (int k = 0; k < num; ++k)
                {
                    pixel[k] = m_imagedata[(i + delta[k][0])*widthbyte + j + delta[k][1]];
                }
                //1.2 排序
                qsort(pixel, num, sizeof(unsigned char), compa);
                //1.3 获取该中心点的值
                m_imagedata[i*widthbyte + j] = pixel[num / 2];
            }
        }
    }

     

    3 中值滤波概述

      中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值

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

    4 中值滤波算法原理

      中值滤波数学实现:对一个数字信号序列xj(-∞<j<∞)进行滤波处理时,首先要定义一个长度为奇数的L长窗口,L=2N+1,N为正整数。设在某一个时刻,窗口内的信号样本为x(i-N),…,x(i),…,x(i+N),其中x(i)为位于窗口中心的信号样本值。对这L个信号样本值按从小到大的顺序排列后,其中值,在i处的样值,便定义为中值滤波的输出值。

      在实际应用中,随着所选用窗口长度的增加,滤波的计算量将会迅速增加。因此,寻求中值滤波的快速算法,是中值滤波理论的一个重要研究内容。中值滤波的快速算法,一般采用下述三种方式:①直方图数据修正法;②样本值二进制表示逻辑判断法;③数字和模拟的选择网络法。

      对中值滤波的理论研究,还集中于统计特性分析和根序列的描述方面。当一个信号序列经一特定窗口长度的中值滤波反复处理后,它会收敛于某一个不再变化的序列,这个序列称为中值滤波的根序列。根序列是描述中值滤波特性的一个重要概念。通过对根序列结构的研究,可以确定原信号序列中,哪些成分可以经中值滤波后保留下来,哪些成分将被抑制。这对确定中值滤波器的窗口长度,提供了重要依据。用VLSI实现的中值滤波器芯片,可供实时处理中应用。

            C代码实现。

    // zhongzhilvbo.cpp : 定义控制台应用程序的入口点。
    //
    
    #include <stdio.h>
    #include <math.h>
    #include <memory.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include "stdafx.h"
    //原图象的宽度和高度
    #define width 352
    #define higth 288
    
    int lvbo(unsigned char D[9])  //冒泡排序
    {
        unsigned int temp;
        int i,j;
    
        for(i=0;i<9;i++)
        {
            for(j=0;j<9-i;j++)
            {
                if(D[i]>D[j+1])
                {
                    temp=D[i];
                    D[i]=D[j+1];
                    D[j+1]=temp;
                }
            }    
        }
            
        return D[4];
    }
    
    void main()
    {
        FILE *fp,*newfp;
        int i,j;
    
        if(!(fp=fopen("fmh1.bmp","rb")))
        {
            printf("Open file %s error!\n","k.bmp");
            return ;
        }
    
        if(!(newfp=fopen("fmout.bmp","wb")))
        {
            printf("Open file %s error!\n","result.bmp");
            return ;
        }
    
        unsigned char buffer[54+1024];//定义原图像头缓冲区
        fread(buffer,1,54+1024,fp);//读取文件头54个字节
    
        unsigned long length=width*higth;//图像的总象素个数
        unsigned char readData[higth][width];               //用于存储原图数据的数组
        unsigned char writeData[higth][width];               //用于存储原图数据的数组
    
        fread(&readData[0][0], sizeof(unsigned char),length, fp);//从原图读入数据
        
        for(i=0;i<higth;i++)
        {
            for(j=0;j<width;j++)
            {
                writeData[i][j]=readData[i][j];
            }
        }
             
        unsigned char D[9];        //定义选取框
        for(i=1;i<higth-1;i++)
        {
            for(j=1;j<width-1;j++)
            {
                D[0]=readData[i-1][j+1];
                D[1]=readData[i][j+1];
                D[2]=readData[i+1][j+1];
                D[3]=readData[i-1][j];
                D[4]=readData[i][j];
                D[5]=readData[i+1][j];
                D[6]=readData[i-1][j-1];
                D[7]=readData[i][j-1];
                D[8]=readData[i+1][j-1];
                writeData[i][j]=lvbo(D);
            }
        }
    
        fwrite(buffer,sizeof(unsigned char),54+1024,newfp);
        fwrite(writeData,sizeof(unsigned char),length,newfp);
        fclose(newfp);
        fclose(fp);
    
        return ;
    }

     

    参考:http://www.cnblogs.com/tanfy/p/median_filter.html

            http://www.cnblogs.com/qiqibaby/p/5281743.html  

    展开全文
  • 图像处理中值滤波C/C++算法

    热门讨论 2020-07-23 23:34:00
    该算法用于处理8位灰度值图像,使用N=3的值滤波的算法程序,可以很方便的转换成N=5、7、9的中值滤波算法。 经该算法处理椒盐噪声的图像后,可以看出与原噪声图像的不同,但是效果不是那么的明显。
  • 图像处理滤波介绍及C实现

    千次阅读 2017-09-23 10:14:03
    中值滤波的基本原理是把数字图像或数字序列一点的值用该点的一个邻域各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行...

    中值滤波概述

      中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值

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

    中值滤波算法原理

      中值滤波数学实现:对一个数字信号序列xj(-∞<j<∞)进行滤波处理时,首先要定义一个长度为奇数的L长窗口,L=2N+1N为正整数。设在某一个时刻,窗口内的信号样本为x(i-N)x(i)x(i+N),其中x(i)为位于窗口中心的信号样本值。对这L个信号样本值按从小到大的顺序排列后,其中值,在i处的样值,便定义为中值滤波的输出值

      在实际应用中,随着所选用窗口长度的增加,滤波的计算量将会迅速增加。因此,寻求中值滤波的快速算法,是中值滤波理论的一个重要研究内容。中值滤波的快速算法,一般采用下述三种方式:①直方图数据修正法;②样本值二进制表示逻辑判断法;③数字和模拟的选择网络法。

      对中值滤波的理论研究,还集中于统计特性分析和根序列的描述方面。当一个信号序列经一特定窗口长度的中值滤波反复处理后,它会收敛于某一个不再变化的序列,这个序列称为中值滤波的根序列。根序列是描述中值滤波特性的一个重要概念。通过对根序列结构的研究,可以确定原信号序列中,哪些成分可以经中值滤波后保留下来,哪些成分将被抑制。这对确定中值滤波器的窗口长度,提供了重要依据。用VLSI实现的中值滤波器芯片,可供实时处理中应用。

    中值滤波算法流程

                         

    中值滤波应用及优势

      中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大.

      中值滤波在图像处理,常用于保护边缘信息,是经典的平滑噪声的方法。

    5 中值滤波代码实现

     

    复制代码
     1 // zhongzhilvbo.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include <stdio.h>
     5 #include <math.h>
     6 #include <memory.h>
     7 #include <conio.h>
     8 #include <stdlib.h>
     9 #include <windows.h>
    10 #include "stdafx.h"
    11 //原图象的宽度和高度
    12 #define width 352
    13 #define higth 288
    14 
    15 int lvbo(unsigned char D[9])
    16 {
    17     unsigned int temp;
    18     int i,j;
    19 
    20     for(i=0;i<9;i++)
    21     {
    22         for(j=0;j<9-i;j++)
    23         {
    24             if(D[i]>D[j+1])
    25             {
    26                 temp=D[i];
    27                 D[i]=D[j+1];
    28                 D[j+1]=temp;
    29             }
    30         }    
    31     }
    32         
    33     return D[4];
    34 }
    35 
    36 void main()
    37 {
    38     FILE *fp,*newfp;
    39     int i,j;
    40 
    41     if(!(fp=fopen("fmh1.bmp","rb")))
    42     {
    43         printf("Open file %s error!\n","k.bmp");
    44         return ;
    45     }
    46 
    47     if(!(newfp=fopen("fmout.bmp","wb")))
    48     {
    49         printf("Open file %s error!\n","result.bmp");
    50         return ;
    51     }
    52 
    53     unsigned char buffer[54+1024];//定义原图像头缓冲区
    54     fread(buffer,1,54+1024,fp);//读取文件头54个字节
    55 
    56     unsigned long length=width*higth;//图像的总象素个数
    57     unsigned char readData[higth][width];               //用于存储原图数据的数组
    58     unsigned char writeData[higth][width];               //用于存储原图数据的数组
    59 
    60     fread(&readData[0][0], sizeof(unsigned char),length, fp);//从原图读入数据
    61     
    62     for(i=0;i<higth;i++)
    63     {
    64         for(j=0;j<width;j++)
    65         {
    66             writeData[i][j]=readData[i][j];
    67         }
    68     }
    69          
    70     unsigned char D[9];        //定义选取框
    71     for(i=1;i<higth-1;i++)
    72     {
    73         for(j=1;j<width-1;j++)
    74         {
    75             D[0]=readData[i-1][j+1];
    76             D[1]=readData[i][j+1];
    77             D[2]=readData[i+1][j+1];
    78             D[3]=readData[i-1][j];
    79             D[4]=readData[i][j];
    80             D[5]=readData[i+1][j];
    81             D[6]=readData[i-1][j-1];
    82             D[7]=readData[i][j-1];
    83             D[8]=readData[i+1][j-1];
    84             writeData[i][j]=lvbo(D);
    85         }
    86     }
    87 
    88     fwrite(buffer,sizeof(unsigned char),54+1024,newfp);
    89     fwrite(writeData,sizeof(unsigned char),length,newfp);
    90     fclose(newfp);
    91     fclose(fp);
    92 
    93     return ;
    94 }
    复制代码

     

    经过中值滤波处理后的对比图片:

      

    展开全文
  • 图像处理:中值滤波&均值滤波

    万次阅读 多人点赞 2018-08-16 20:06:58
    转自:openCV之滤波&amp;均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543  在开始我们今天的博客之前,我们需要先了解一下什么是滤波: openCV之滤波&...

    转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543

     在开始我们今天的博客之前,我们需要先了解一下什么是滤波:

    openCV之中值滤波&均值滤波(及代码实现)首先我们看一下图像滤波的概念。图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

    下图左边是原图右边是噪声图:

    消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
    图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
    而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

    平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。
    空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
    关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

     

    举一个滤波在我们生活中的应用:美颜的磨皮功能。如果将我们脸上坑坑洼洼比作是噪声的话,那么滤波算法就是来取出这些噪声,使我们自拍的皮肤看起来很光滑。

    这篇博文会介绍中值滤波以及均值滤波两种算法

     

    一.均值滤波

              图片中一个方块区域(一般为3*3)内,中心点的像素为全部点像素值的平均值。均值滤波就是对于整张图片进行以上操作。

    我们可以看下图的矩阵进行理解

                                                                          

                             

    缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声

    实现代码:

    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include<ctime>
    using namespace cv;
    using namespace std;
     
    //均值滤波
    void AverFiltering(const Mat &src,Mat &dst) {
    	if (!src.data) return;
    	//at访问像素点
    	for (int i = 1; i<src.rows; ++i)
    		for (int j = 1; j < src.cols; ++j) {
    			if ((i - 1 >= 0) && (j - 1) >= 0 && (i + 1)<src.rows && (j + 1)<src.cols) {//边缘不进行处理
    				dst.at<Vec3b>(i, j)[0] = (src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i - 1, j - 1)[0] + src.at<Vec3b>(i - 1, j)[0] + src.at<Vec3b>(i, j - 1)[0] +
    					src.at<Vec3b>(i - 1, j + 1)[0] + src.at<Vec3b>(i + 1, j - 1)[0] + src.at<Vec3b>(i + 1, j + 1)[0] + src.at<Vec3b>(i, j + 1)[0] +
    					src.at<Vec3b>(i + 1, j)[0]) / 9;
    				dst.at<Vec3b>(i, j)[1] = (src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i - 1, j - 1)[1] + src.at<Vec3b>(i - 1, j)[1] + src.at<Vec3b>(i, j - 1)[1] +
    					src.at<Vec3b>(i - 1, j + 1)[1] + src.at<Vec3b>(i + 1, j - 1)[1] + src.at<Vec3b>(i + 1, j + 1)[1] + src.at<Vec3b>(i, j + 1)[1] +
    					src.at<Vec3b>(i + 1, j)[1]) / 9;
    				dst.at<Vec3b>(i, j)[2] = (src.at<Vec3b>(i, j)[2] + src.at<Vec3b>(i - 1, j - 1)[2] + src.at<Vec3b>(i - 1, j)[2] + src.at<Vec3b>(i, j - 1)[2] +
    					src.at<Vec3b>(i - 1, j + 1)[2] + src.at<Vec3b>(i + 1, j - 1)[2] + src.at<Vec3b>(i + 1, j + 1)[2] + src.at<Vec3b>(i, j + 1)[2] +
    					src.at<Vec3b>(i + 1, j)[2]) / 9;
    			}
    			else {//边缘赋值
    				dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];
    				dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[1];
    				dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[2];
    			}
    		}
    }
    //图像椒盐化
    void salt(Mat &image, int num) {
    	if (!image.data) return;//防止传入空图
    	int i, j;
    	srand(time(NULL));
    	for (int x = 0; x < num; ++x) {
    		i = rand() % image.rows;
    		j = rand() % image.cols;
    		image.at<Vec3b>(i, j)[0] = 255;
    		image.at<Vec3b>(i, j)[1] = 255;
    		image.at<Vec3b>(i, j)[2] = 255;
    	}
    }
    void main() {
    	Mat image = imread("路飞.jpg");
     
    	Mat Salt_Image;
    	image.copyTo(Salt_Image);
    	salt(Salt_Image, 3000);
     
    	Mat image1(image.size(), image.type());
    	Mat image2;
    	AverFiltering(Salt_Image, image1);
    	blur(Salt_Image, image2, Size(3, 3));//openCV库自带的均值滤波函数
    	imshow("原图", image);
    	imshow("自定义均值滤波", image1);
    	imshow("openCV自带的均值滤波", image2);
    	waitKey();
    }
    


    效果图:

     

    可以看到图片变模糊而且噪声并没有很有效的去除,该算法只是模糊化了图片而已。

    二.中值滤波

           首先,我们复习中值。在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。

                                         

    代码:

    //求九个数的中值
    uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,
    	uchar n6, uchar n7, uchar n8, uchar n9) {
    	uchar arr[9];
    	arr[0] = n1;
    	arr[1] = n2;
    	arr[2] = n3;
    	arr[3] = n4;
    	arr[4] = n5;
    	arr[5] = n6;
    	arr[6] = n7;
    	arr[7] = n8;
    	arr[8] = n9;
    	for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序
    		for (int i = gap; i < 9; ++i)
    			for (int j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap)
    				swap(arr[j], arr[j + gap]);
    	return arr[4];//返回中值
    }
     
    //图像椒盐化
    void salt(Mat &image, int num) {
    	if (!image.data) return;//防止传入空图
    	int i, j;
    	srand(time(NULL));
    	for (int x = 0; x < num; ++x) {
    		i = rand() % image.rows;
    		j = rand() % image.cols;
    		image.at<Vec3b>(i, j)[0] = 255;
    		image.at<Vec3b>(i, j)[1] = 255;
    		image.at<Vec3b>(i, j)[2] = 255;
    	}
    }
     
    //中值滤波函数
    void MedianFlitering(const Mat &src, Mat &dst) {
    	if (!src.data)return;
    	Mat _dst(src.size(), src.type());
    	for(int i=0;i<src.rows;++i)
    		for (int j=0; j < src.cols; ++j) {
    			if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
    				_dst.at<Vec3b>(i, j)[0] = Median(src.at<Vec3b>(i, j)[0], src.at<Vec3b>(i + 1, j + 1)[0],
    					src.at<Vec3b>(i + 1, j)[0], src.at<Vec3b>(i, j + 1)[0], src.at<Vec3b>(i + 1, j - 1)[0],
    					src.at<Vec3b>(i - 1, j + 1)[0], src.at<Vec3b>(i - 1, j)[0], src.at<Vec3b>(i, j - 1)[0],
    					src.at<Vec3b>(i - 1, j - 1)[0]);
    				_dst.at<Vec3b>(i, j)[1] = Median(src.at<Vec3b>(i, j)[1], src.at<Vec3b>(i + 1, j + 1)[1],
    					src.at<Vec3b>(i + 1, j)[1], src.at<Vec3b>(i, j + 1)[1], src.at<Vec3b>(i + 1, j - 1)[1],
    					src.at<Vec3b>(i - 1, j + 1)[1], src.at<Vec3b>(i - 1, j)[1], src.at<Vec3b>(i, j - 1)[1],
    					src.at<Vec3b>(i - 1, j - 1)[1]);
    				_dst.at<Vec3b>(i, j)[2] = Median(src.at<Vec3b>(i, j)[2], src.at<Vec3b>(i + 1, j + 1)[2],
    					src.at<Vec3b>(i + 1, j)[2], src.at<Vec3b>(i, j + 1)[2], src.at<Vec3b>(i + 1, j - 1)[2],
    					src.at<Vec3b>(i - 1, j + 1)[2], src.at<Vec3b>(i - 1, j)[2], src.at<Vec3b>(i, j - 1)[2],
    					src.at<Vec3b>(i - 1, j - 1)[2]);
    			}
    			else
    				_dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);
    		}
    	_dst.copyTo(dst);//拷贝
    }
     
     
    void main() {
    	Mat image = imread("路飞.jpg");
     
    	Mat Salt_Image;
    	image.copyTo(Salt_Image);
    	salt(Salt_Image, 3000);
     
    	Mat image3, image4;
    	MedianFlitering(Salt_Image, image3);
    	medianBlur(Salt_Image, image4, 3);
    	imshow("自定义中值滤波处理后", image3);
    	imshow("openCV自带的中值滤波", image4);
    	waitKey();
    }
    

     

    效果图:

    可以看到,椒盐噪声很好的被平滑了,而且也没均值那样模糊化太过于严重。

    三 填充问题

    在对图像应用滤波器进行过滤时,边界问题是一个需要处理的问题。一般来说,有3种处理的方法。

    1. 不做边界处理

    不对图像的边界作任何处理,在对图像进行滤波时,滤波器没有作用到图像的四周,因此图像的四周没有发生改变。

     

    2. 填充0

    对图像的边界做扩展,在扩展边界中填充0,对于边长为2k+1的方形滤波器,扩展的边界大小为k,若原来的图像为[m, n],则扩展后图像变为[m+2k, n+2k]。进行滤波之后,图像会出现一条黑色的边框。

     

    3. 填充最近像素值

    扩展与 填充0 的扩展类似,只不过填充0的扩展是在扩展部分填充0,而这个方法是填充距离最近的像素的值。

    四 总结:

    均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。

    均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。

    中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。

    参考:

    1.均值滤波和中值滤波

    https://blog.csdn.net/cjsh_123456/article/details/79261271

    2.

    展开全文
  • 图像处理的几种滤波

    千次阅读 2018-04-03 11:09:30
    均值滤波均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素...

    均值滤波

    均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。采样Kernel数据通常是3X3的矩阵,如下表示:

    从左到右从上到下计算图像中的每个像素,最终得到处理后的图像。均值滤波可以加上两个参数,即迭代次数,Kernel数据大小。一个相同的Kernel,但是多次迭代就会效果越来越好。同样,迭代次数相同,Kernel矩阵越大,均值滤波的效果就越明显。


    中值滤波

    中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。中值滤波是跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是将周围像素和中心像素排序以后,取中值,一个3X3大小的中值滤波如下:

     


    最大最小值滤波

    最大最小值滤波是一种比较保守的图像处理手段,与中值滤波类似,首先要排序周围像素和中心像素值,然后将中心像素值与最小和最大像素值比较,如果比最小值小,则替换中心像素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。一个Kernel矩阵为3X3的最大最小值滤波如下:

     


    双边滤波

    一种同时考虑了像素空间差异与强度差异的滤波器,因此具有保持图像边缘的特性。

    先看看高斯滤波器


    其中W是权重,i和j是像素索引,K是归一化常量。公式中可以看出,权重只和像素之间的空间距离有关系,无论图像的内容是什么,都有相同的滤波效果。

    再来看看双边滤波器,它只是在原有高斯函数的基础上加了一项,如下


    其中 I 是像素的强度值,所以在强度差距大的地方(边缘),权重会减小,滤波效应也就变小。总体而言,在像素强度变换不大的区域,双边滤波有类似于高斯滤波的效果,而在图像边缘等强度梯度较大的地方,可以保持梯度


    引导滤波

    与双边滤波最大的相似之处,就是同样具有保持边缘特性。在引导滤波的定义中,用到了局部线性模型,至于该模型,可以暂时用下图简单的理解


    该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。

    同理,我们可以认为图像是一个二维函数,而且没法写出解析表达式,因此我们假设该函数的输出与输入在一个二维窗口内满足线性关系,如下


    其中,q是输出像素的值,I是输入图像的值,i和k是像素索引,a和b是当窗口中心位于k时该线性函数的系数。其实,输入图像不一定是待滤波的图像本身,也可以是其他图像即引导图像,这也是为何称为引导滤波的原因。对上式两边取梯度,可以得到


    即当输入图像I有梯度时,输出q也有类似的梯度,现在可以解释为什么引导滤波有边缘保持特性了。

    下一步是求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值与真实值p之间的差距最小,也就是让下式最小


    这里p只能是待滤波图像,并不像I那样可以是其他图像。同时,a之前的系数(以后都写为e)用于防止求得的a过大,也是调节滤波器滤波效果的重要参数。通过最小二乘法,我们可以得到


    其中,是I在窗口w_k中的平均值,是I在窗口w_k中的方差,是窗口w_k中像素的数量,是待滤波图像p在窗口w_k中的均值。

    在计算每个窗口的线性系数时,我们可以发现一个像素会被多个窗口包含,也就是说,每个像素都由多个线性函数所描述。因此,如之前所说,要具体求某一点的输出值时,只需将所有包含该点的线性函数值平均即可,如下


    这里,w_k是所有包含像素i的窗口,k是其中心位置。

    当把引导滤波用作边缘保持滤波器时,往往有 I = p ,如果e=0,显然a=1, b=0是E(a,b)为最小值的解,从上式可以看出,这时的滤波器没有任何作用,将输入原封不动的输出。如果e>0,在像素强度变化小的区域(或单色区域),有a近似于(或等于)0,而b近似于(或等于),即做了一个加权均值滤波;而在变化大的区域,a近似于1,b近似于0,对图像的滤波效果很弱,有助于保持边缘。而e的作用就是界定什么是变化大,什么是变化小。在窗口大小不变的情况下,随着e的增大,滤波效果越明显。

    在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。引导滤波最大的优势在于,可以写出时间复杂度与窗口大小无关的算法,因此在使用大窗口处理图片时,其效率更高。


    def guidedfilter(I,p,r,eps):
        '''I:引导图图;
        p:输入图(p=I);
        r :半径:
        eps:regulation 
        f:为窗口半径为r的均值滤波器;
        corr:相关;
        var:方差;
        cov:协方差
        '''
        height,width = I.reshape()
        m_I = cv2.boxFilter(I,-1,(r,r))  #f_mean(I) 均值滤波blur和盒式滤波一样
        m_p = cv2.boxFilter(p,-1,(r,r))  #f_mean(p)
    
    
        m_II = cv2.boxFilter(I*I,-1,(r,r)) #f_mean(I.*I)
        m_Ip = cv2.boxFilter(I * p, -1, (r, r))  #f_mean(I.*p)
    
        var_I = m_II-m_I*m_I   #求方差:corr_I -mean_I.*mean_I
        cov_Ip = m_Ip - m_I * m_p  #协方差: #cov_Ip-mean_I.*mean_p
    
        a = cov_Ip/(var_I+eps)  #cov_Ip./(var_I+eps)
        b = m_p-a*m_I   #mean_p -a.*mean_I
        m_a = cv2.boxFilter(a,-1,(r,r))  #mean_a
        m_b = cv2.boxFilter(b,-1,(r,r))  #mean_b
        return m_a*I+m_b

    展开全文
  • 图像处理滤波算法

    万次阅读 2016-06-30 15:03:31
    一、学习心得: 在我学习基本滤波算法原理的时候,因为刚接触不是很理解算法具体是怎样实现的,不过在学习了图像形态学之后,发现滤波算法其实很简单。所以在此建议初学者在...而在图像处理中滤波算法,处理的
  • 计算机视觉、图像处理中常见的滤波操作

    万次阅读 多人点赞 2016-10-08 12:11:59
    图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的...
  • 包含图像处理中常用的几种滤波方法matlab代码和ppt讲解,包含均值滤波,中值滤波,高斯滤波,双边滤波示例演示。
  • 图像处理 中值滤波与均值滤波 matlab算法实现
  • OpenCV图像处理滤波

    2018-12-29 15:38:13
     即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 二、图像滤波分类  大体上图像滤波可以分为...
  • 图像滤波算法总结

    万次阅读 多人点赞 2018-09-11 00:01:13
    该篇主要是对图像滤波算法一个整理,主要参考的大神的博客: ...通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。 图像...
  • matlab图像处理——平滑滤波

    万次阅读 2018-11-01 20:52:00
    平滑滤波——matlab图像处理 平滑滤波的目的是消除或尽量减少噪声,改善图像的质量。假设加性噪声是随机独立分布,这样利用图像像素领域的平均或加权平均即可有效地抑制噪声干扰。从信号分析的观点来看,图像平滑...
  • 图像平滑处理-中值滤波

    万次阅读 2018-11-06 15:57:18
    图像滤波:即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 消除图像的噪声...
  • matlab实现图像处理均值滤波

    热门讨论 2020-07-30 23:33:03
    matlab语言实现图像处理的均值滤波,基于3*3模板,对于初学图像处理者很帮助,该方法算法简单易懂。
  • 图像滤波大多数用于图像的模糊处理和减小噪声(个人理解)。常见的滤波有:均值滤波,中值滤波,高斯滤波等。在这我主要介绍一下中值滤波,它对于处理椒盐噪声十分有效。下面我简单介绍下它的原理,以及我自己写的...
  • 常见图像滤波方式

    千次阅读 2019-05-13 18:54:59
    本文介绍五种常见的图像滤波方式:线性滤波(方框滤波、均值滤波、高斯滤波);非线性滤波(中值滤波、双边滤波)。提醒,本文主要是算法公式,没有具体完整的代码。 一、线性滤波 总的来说,这三种线性滤波原理...
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...
  • 图像处理中滤波和卷积是常用到的操作。很多人认为卷积就是滤波,两者并无区别,其实不然。两者在原理上相似,但是在实现的细节上存在一些区别。这篇博文主要叙述这两者之间的区别。 1、滤波 简单来说,滤波操作...
  • 数字图像处理 高通滤波

    千次阅读 2019-02-22 16:42:03
    import numpy as np import cv2 def convert_2d(r): r_ext = np.zeros((r.shape[0] * 2, r.shape[1] * 2)) for i in range(r.shape[0]): for j in range(r.shape[1]): r_ext[i][j] = r...
1 2 3 4 5 ... 20
收藏数 40,311
精华内容 16,124
关键字:

图像处理中滤波方法有哪些