• 使用模板处理图像相关概念:   模板:矩阵方块,其数学含义是一种卷积运算。   卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相 乘,

    参考自:http://blog.csdn.net/yangtrees/article/details/8740933 等

    1.图像卷积(模板)

    (1).使用模板处理图像相关概念:     

         模板:矩阵方块,其数学含义是卷积运算。      

         卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积(权矩阵)的每个元素对应相 乘,所有乘积之和作为区域中心像素的新值。
         卷积核:卷积时使用到的权用一个矩阵表示,该矩阵一个权矩阵。
         卷积示例:
                  3 * 3 的像素区域R与卷积G卷积运算:
                  R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9
                

    (2).使用模板处理图像的问题(越界问题):
           边界问题:当处理图像边界像素时,卷积与图像使用区域不能匹配,卷积核的中心边界像素点对应,卷积运算将出现问题。
           处理办法:
                  A. 忽略边界像素,即处理后的图像将丢掉这些像素。
                  B. 保留原边界像素,即copy边界像素到处理后的图像

    (3).常用模板


    我们来看卷积的概念.
    连续空间的卷积定义:  f(x)g(x)的卷积是 f(t-x)g(x) 在t从负无穷到正无穷的积分值. t-x要在f(x)定义域内,所以看上去很大的积分实际上还是在定范围的. 实际的过程就是f(x) 先做一个Y轴的反转,然后再沿X轴平移t就是f(t-x),然后再把g(x)拿来,两者乘积的值再积分.想象下如果g(x)或者f(x)是个单位的阶越函数. 那么就是f(t-x)g(x)相交部分的面积.这就是卷积了.
    把积分符号换成求和就是离散空间的卷积定义了.那么在图像卷积卷积地是什么意思呢,就是图像就是图像f(x),模板是g(x),然后将模版g(x)在模版中移动,每到一个位置,就把f(x)g(x)的定义域相交的元素卷积定义上是线性系统分析经常用到的.线性系统就是一个系统的输入和输出的关系是线性关系.就是说整个系统可以分解成N多的无关独立变化,整个系统就是这些变化的累加. 如 x1->y1, x2->y2; 那么A*x1 + B*x2 -> A*y1 + B*y2 这就是线性系统. 表示一个线性系统可以用积分的形式 

    ,

    就是f(t,x)表示的是A B之类的线性系数.看上去很像卷积呀,对,如果f(t,x) = F(t-x) 不就是了吗.从f(t,x)变成F(t-x)实际上是说明f(t,x)是个线性移不变,就是说变量的差不变化的时候, 那么函数的值不变化. 实际上说明一个事情就是说线性移不变系统的输出可以通过输入和表示系统线性特征的函数卷积得到.


    卷积示例:

    A =
         1     3     3     5     2
         2     4     1     1     3
         3     5     5     2     4
         4     4     2     3     1
         5     6     3     4     2

    G =

         1     2     3
         4     5     6
         7     8     9

    首先对卷积模板G旋转180°。matlab代码:rot90(G,2) 即 将a逆时针转2次90度。




    依次对full,same,value进行解释:


    K>> B=conv2(A,G,'full'); OR B=conv2(A,G);
    B =
         1     5    12    20    21    19     6
         6    25    48    68    59    49    21
        18    66   114   146   127    96    48
        30    91   142   133   107    76    54
        42   111   184   173   139    89    48
        48   109   154   140    95    69    21
        35    82   114   106    73    52    18

    K>> B=conv2(A,G,'same')
    B =
        25    48    68    59    49
        66   114   146   127    96
        91   142   133   107    76
       111   184   173   139    89
       109   154   140    95    69

    K>> B=conv2(A,G,'valid')

    B =
       114   146   127
       142   133   107
       184   173   139


    2.图像滤波

    (1)图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接响到后续图像处理和分析的有效性和可靠性。(滤波就是要去除没用的信息,保留有用的信息,可能是低频,也可能是高频)

    (2)滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;  另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

    对滤波处理的要求有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

    (3)图像的滤波方法: 

    (一)图像的滤波方法很多,主要可以分为频率域法和空间域法两大类。频率域法的处理是在图像的某种变换域内,对图像的变换系数值进行运算,然后通过逆变换获得增强图像。这是一种间接的图像滤波方法。空间滤波方法是一类直接的滤波方法,它在处理图像时直接对图像灰度作运算。

         <1>频率域滤波:是将图像从空间或时间域转换到频率域,再利用变换系数反映某些图像特征的性质进行图像滤波的方法。傅立叶变换是一种常用的变换。在傅立叶变换域,频谱的直流分量正比于图像的平均亮度,噪声对应于频率较高的区域,图像实体位于频率较低的区域。图像在变换具有的这些内在特性可被用于图像滤波。可以构造一个低通滤波器,使低频分量顺利通过而有效地阻于高频分量,即可滤除图像的噪声,再经过反变换来取得平滑的图像。

              低通的数学表达式如下式所示:
                                          

              式中F (u, v)一含有噪声的原图像的傅立叶变换;
              H (u, v)一为传递函数,也称转移函数(即低通滤波器);
              G (u, v)一为经低通滤波后输出图像的傅立叶变换。
              H滤波滤去高频成分,而低频信息基本无损失地通过。滤波后,经傅立叶变换反变换可得平滑图像,即
             
     选择适当的传递函数H (u, v),对频率域低通滤波关系重大。常用的传递函数有梯形函数、指数函数、巴特沃思函数等。
              频域常用的几种低通滤波器为理想低通滤波器(Ideal  circular Iow-passfilter)、巴特沃思(Butterworth)低通滤波器、指数低通滤波器及梯形低通滤波器。这些低通滤波器,都能在图像内有噪声干扰成分时起到改善的作用。
          <2>常用的平面空间域滤波法有两类:  

              一类是拟合图像的方法,包括n阶多项式拟合、离散正交多项式拟合、二次曲面拟合等多种方法; 

              另一类是平滑图像的方法,包括领域平均法、中值滤波法、梯度倒数加权法、选择式掩模法等。

    (二)按频率高低

          <1>高通滤波:边缘提取与增强。边缘区域的灰度变换加大,也就是频率较高。所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤;

          <2>低通滤波:边缘平滑,边缘区域将被平滑过渡。

             附: 高斯滤波高斯滤波是一种线性平滑滤波,即低通滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由本身和邻域内的其他像素值经过加权平均后得到。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。3×3的掩模如下:

    3*3掩模×1/16 

    从结构化掩模中可以看到,处于掩模中心的位置比其他任何像素的权值都大,因此在均值计算中给定的这一像素显得更为重要。而距离掩模中心较远的像素就显得不太重要,这样做是为了减小平滑处理中的模糊。

    (三)线性与非线性滤波

            <1>线性滤波:线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如(1)均值滤波器(模板内像素灰度值的平均值)、(2)高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。

             <2>非线性滤波:非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器、最小值滤波器、中值滤波器等,是通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。五种常见的非线性滤波算子,这五种滤波算子对不同的图像都会有不同的作用,最常用的是中值滤波,因为它的效果最好且信息损失的最少。

    (1).极大值滤波

        极大值滤波就是选取像素点领域的最大值作为改点的像素值,有效率去了灰度值比较低的噪声,也可作为形态学里面的膨胀操作。

        极大值滤波可以表示为: Maximum(A)=max[A(x+i,y+j)]      (x,y)属于M

        注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    (2).极小值滤波(与极大值滤波相反)

    (3).中点滤波

         中点滤波常用于去除图像中的短尾噪声,例如高斯噪声和均匀分布噪声。终点滤波器的输出时给定窗口内灰度的极大值和极小值的平均值;

        Midpoint(A)=(max[A(x+i,y+j)]+min[A(x+i,y+j)])/2          (x,y)属于M

       注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    (4).中值滤波

       中值滤波可以消除图像中的长尾噪声,例如负指数噪声和椒盐噪声。在消除噪声时,中值滤波对图像噪声的模糊极小(受模板大小的影响),中值滤波实质上是用模板内所包括像素灰度的中值来取代模板中心像素的灰度。中值滤波在消除图像内椒盐噪声和保持图像的空域细节方面,其性能优于均值滤波。

           Median(A)=Median[A(x+i,y+j)]              (x,y)属于M

    注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    (5).加权中值滤波(中值滤波的改进)

        加权中值滤波是在中值滤波的基础上加以改进,其性能在一定程度上优于中值滤波。

         下面是自己在算法上的改进:以例子说明

         若说选模板的大小为5,那么这个模板就唯一确定为:

                 1  1  5   1   1   

                 1  1  5   1   1  

                 5  5  5   5   5   

                 1  1  5   1   1  

                 1  1  5   1   1   

        上图中的数字表式改点像素在序列中出现的次数。然后根据模板平滑图像。实验证明该方法好于传统中值滤波。当然还有其他方法;

    
    
    附:噪声
              (高斯噪声:是指噪声服从高斯分布,即某个强度的噪声点个数最多,离这个强度越远噪声点个数越少,且这个规律服从高斯分布。高斯噪声是一种加性噪声,即噪声直接加到原图像上,因此可以用线性滤波器滤除。
                  椒盐噪声:类似把椒盐撒在图像上,因此得名,是一种在图像上出现很多白点或黑点的噪声,如电视里的雪花噪声等。椒盐噪声可以认为是一种逻辑噪声,用线性滤波器滤除的结果不好,一般采用中值滤波器滤波可以得到较好的结果。)
    
    
    图像滤波相对比较容易理解,在这里就不一一作图说明了。


    3.图像平滑

    图像平滑 image smoothing: 压制、弱化或消除图像中的细节、突变、边缘和噪声,就是图像平滑化。图像平滑是对图像作低通滤波,可在空间域或频率域实现。空间域图像平滑方法主要用低通卷积滤波、中值滤波等;频率域图像平滑常用的低通滤波器有低通梯形滤波器、低通高斯滤波器、低通指数滤波器、巴特沃思低通滤波器等。



    关系:

    图像卷积:一种实现手段,不管是滤波还是别的什么,可以说是数学在图像处理的一种延伸。

    图像滤波:一种图像处理方法,来实现不同目的。

    图像平滑:实际上就是低通滤波。




    尾话:转自http://blog.csdn.net/haoji007/article/details/53911940

    图像处理中滤波(filtering)与卷积(convolution)的区别

    图像处理中滤波和卷积是常用到的操作。很多人认为卷积就是滤波,两者并无区别,其实不然。两者在原理上相似,但是在实现的细节上存在一些区别。这篇博文主要叙述这两者之间的区别。

    1、滤波

    简单来说,滤波操作就是图像对应像素与掩膜(mask)的乘积之和。

    比如有一张图片和一个掩膜,如下图:



    那么像素(i,j)的滤波后结果可以根据以下公式计算:

    其中G(i,j)是图片中(i,j)位置像素经过滤波后的像素值。

    当掩膜中心m5位置移动到图像(i,j)像素位置时,图像(i,j)位置像素称为锚点

    滤波步骤:

    1. 对原始图像的边缘进行某种方式的填充(一般为0填充)。
    2. 将掩膜划过整幅图像,计算图像中每个像素点的滤波结果。
    依照这个步骤,假设我们有一个二维矩阵I,掩膜M,则滤波的结果如下:


    滤波后的图像大小不变。



    2、卷积

    卷积的原理与滤波类似。但是卷积却有着细小的差别。
    卷积操作也是卷积核与图像对应位置的乘积和。但是卷积操作在做乘积之前,需要先将卷积核翻转180度,之后再做乘积。

    卷积步骤:
    1. 180度翻转卷积核。
    2. 不做边界填充,直接对图像进行相应位置乘积和。
    从以上步骤可以看出,如果卷积核不是中心对称的,那么卷积和滤波操作将会得到完全不一样的结果。另外,卷积操作会改变图像大小!

    由于卷积操作会导致图像变小(损失图像边缘),所以为了保证卷积后图像大小与原图一致,经常的一种做法是人为的在卷积操作之前对图像边缘进行填充。

    最后,关于卷积后图像尺寸的计算:假设原始图像为M*M,卷积核大小为N*N,边缘填充像素个数为pad,步长为stride。则卷积后图像的尺寸变为:m =(M-N+2*pad)/sride+1。


    自我总结一下:

    一、滤波其实也是对图像进行平滑操作,滤波后的图像与原图像大小相同。【适当的话,进行边界扩充,得到滤波后的效果会比没有进行边界扩充得到的效果好一些】。

    二、卷积操作首先是将卷积模板进行旋转180度,之后进行卷积操作。其卷积后的结果与原图像大小不一致,如上文我自己整理的那样。







    展开全文
  • 转自:openCV之中值滤波&amp;...  在开始我们今天的博客之前,我们需要先了解一下什么是滤波: 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.

    展开全文
  • OpenCV图像处理滤波

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

    一、图像滤波

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

    二、图像滤波分类

            大体上图像滤波可以分为线性滤波和非线性滤波,线性滤波包括方框滤波、均值滤波、高斯滤波,非线性滤波包括中值滤波和双边滤波。

    三、五种滤波方式

    3.1 方框滤波

            方框滤波即取一个m*n的窗口模板,进行平均求和得到最终值。

    3.2 均值滤波

            均值滤波是一种特殊的方框滤波,即当normalize取true.。

    3.3 高斯滤波

            高斯滤波是一种线性平滑滤波,可以消除高斯噪声,广泛应用于图像处理的减噪过程。通俗地讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都有其本身和邻域内的其他像素经过加权平均后得到。这个权矩阵由二维正太分布函数确定,由于正态分布又叫做高斯分布,所以这项技术就叫做高斯模糊。

            二维高斯函数如下:

                                                         

    3.4 中值滤波

            其基本思路是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的边缘细节。

    3.5 双边滤波

            双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间临近度像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部的特点。

            在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合,公式如下:

                                                              

            其中加权系数取决于定义域核和值域核的乘积。

            其中定义域核表示如下:

                                                

            值域核表示如下:

                                                    

           其中有两个参数Sigma(d)和Sigma(r),当Sigma(d)大时,说明更大的定义域空间影响结果,当Sigma(r)大时,说明更大的值域空间影响结果。

    4、OpenCV中五种图像滤波的综合示例

            下面将用一些代码和结果来说明五种滤波的效果。

            OpenCV中方框滤波函数为boxFilter,均值滤波函数为blur,高斯滤波函数为GaussianBlur,中值滤波函数为medianBlur,双边滤波函数为bilateralFilter。

            下面贴出五种滤波函数的效果图:

    (1)原图

                                 

    (2)方框滤波

                                  

    (3)高斯滤波

                                  

    (4)均值滤波

                                 

    (5)中值滤波

                                

    (6)双边滤波

                                

    读者可以下载源码进行研究。

    展开全文
  • %中值滤波 I0=imread('photo.jpeg'); j=rgb2gray(I0); I = imnoise(j,'salt & pepper'); Z1=medfilt2(I,[3,3]); Z2=medfilt2(I,[5,5]); figure; subplot(1,3,1),imshow(I),title('原图'); subplot(1,3,2),imshow...
    %中值滤波
    I0=imread('photo.jpeg');
    j=rgb2gray(I0);
    I = imnoise(j,'salt & pepper');
    Z1=medfilt2(I,[3,3]);
    Z2=medfilt2(I,[5,5]);
    figure;
    subplot(1,3,1),imshow(I),title('原图');
    subplot(1,3,2),imshow(Z1),title('3*3模板');
    subplot(1,3,3),imshow(Z2),title('5*5模板');
    %均值滤波
    H2=fspecial('average',3);
    JZ=filter2(H2,I)/255;
    H1=fspecial('average',5);
    JZ1=filter2(H1,I)/255;
    figure,
    subplot(1,3,1),imshow(I),title ('原图');
    subplot(1,3,2),imshow(JZ),title ('3*3模板')
    subplot(1,3,3),imshow(JZ1),title ('5*5模板')
    %维纳滤波
    W1=wiener2(I,[3,3]);
    W2=wiener2(I,[5,5]);
    figure,
    subplot(1,3,1),imshow(I),title ('原图');
    subplot(1,3,2),imshow(JZ),title ('3*3模板')
    subplot(1,3,3),imshow(JZ1),title ('5*5模板')

     

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

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

    均值滤波

    均值滤波,是图像处理中最常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。采样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的增大,滤波效果越明显。

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


    [python] view plain copy
    1. def guidedfilter(I,p,r,eps):  
    2.     '''''I:引导图图; 
    3.     p:输入图(p=I); 
    4.     r :半径: 
    5.     eps:regulation  
    6.     f:为窗口半径为r的均值滤波器; 
    7.     corr:相关; 
    8.     var:方差; 
    9.     cov:协方差 
    10.     '''  
    11.     height,width = I.reshape()  
    12.     m_I = cv2.boxFilter(I,-1,(r,r))  #f_mean(I) 均值滤波blur和盒式滤波一样  
    13.     m_p = cv2.boxFilter(p,-1,(r,r))  #f_mean(p)  
    14.   
    15.   
    16.     m_II = cv2.boxFilter(I*I,-1,(r,r)) #f_mean(I.*I)  
    17.     m_Ip = cv2.boxFilter(I * p, -1, (r, r))  #f_mean(I.*p)  
    18.   
    19.     var_I = m_II-m_I*m_I   #求方差:corr_I -mean_I.*mean_I  
    20.     cov_Ip = m_Ip - m_I * m_p  #协方差: #cov_Ip-mean_I.*mean_p  
    21.   
    22.     a = cov_Ip/(var_I+eps)  #cov_Ip./(var_I+eps)  
    23.     b = m_p-a*m_I   #mean_p -a.*mean_I  
    24.     m_a = cv2.boxFilter(a,-1,(r,r))  #mean_a  
    25.     m_b = cv2.boxFilter(b,-1,(r,r))  #mean_b  
    26.     return m_a*I+m_b  
    展开全文
  • 图像滤波算法总结

    2018-09-11 00:01:13
    该篇主要是对图像滤波算法一个整理,主要参考的大神的博客: https://blog.csdn.net/qq_15606489/article/details/52755444 1:图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过...
  • 图像处理滤波算法

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

    2020-05-01 11:27:48
    1、图像滤波的分类和基本概念 概念 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作。 图像滤波的目的有两个: 1、抽出对象的特征作为图像识别的特征模式; 2、...
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...
  • 包含图像处理中常用的几种滤波方法,有matlab代码和ppt讲解,包含均值滤波,中值滤波,高斯滤波,双边滤波,有示例演示。
  • 图像滤波:即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 消除图像中的噪声...
  • 图像滤波的作用: 在尽可能保留图像细节特征的条件下,对目标图像的噪声进行抑制。 常见的图像滤波器:  线性滤波: 均值滤波 高斯滤波  非线性滤波:中值滤波 双边滤波 *均值滤波    均值...
  • 图像滤波大多数用于图像的模糊处理和减小噪声(个人理解)。常见的滤波有:均值滤波,中值滤波,高斯滤波等。在这我主要介绍一下中值滤波,它对于处理椒盐噪声十分有效。下面我简单介绍下它的原理,以及我自己写的...
  • 数字图像处理的均值滤波,用于图像去噪。很完整的源代码
  • 同态滤波增强属于图像频域处理范畴,作用是对图像灰度范围进行调整,通过消除图像上照明不均匀的问题,增强图像的细节,同时对不损失亮区的图像细节。 一幅图像 能够使用它的入射光分量和反射光分量来表示 ,关系...
  • 实现图像的高斯滤波: 通过调整高斯函数的标准差(sigma)来控制平滑程度; void Gaussian(const MyImage &amp;amp;amp;amp;input, MyImage &amp;amp;amp;amp;output, double sigma); 滤波窗口大小取为[6...
  • 目的:突出图像的空间信息,压抑其他无关的信息,或者去除图像的某些信息,恢复其他的信息,因为,图像滤波也是一种图像增强的方法。 2)图像噪声 高斯噪声:噪声的像素值分布可以使用高斯概率密度来描述,0均值的...
  • %实现空间滤波领域处理时的一个重要考虑因素,当滤波掩模的中心靠近图像轮廓时发生的情况 % 当一个n*n的方形掩模,其中心距离图像边缘为(n-1)/2个像素时,该掩模至少有一条边与图像轮廓相重合 %当掩模的中心继续向...
  • 维纳滤波图像恢复中的应用 维纳滤波实现图像恢复 基于MATLAB的维纳滤波图像恢复中的应用 基于MATLAB的图像复原
1 2 3 4 5 ... 20
收藏数 40,048
精华内容 16,019