中值滤波 订阅
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。 展开全文
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
信息
外文名
median filtering
应用学科
通信;图像处理
中文名
中值滤波
中值滤波定义
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。中值滤波方法:对一个数字信号序列xj(-∞
收起全文
精华内容
下载资源
问答
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...

    基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比

    1.  背景知识

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

    方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

             
     

    2

    4

    8

     
     

    1

    3

    9

     
     

    5

    7

    6

     
             

    g(x,y)=med{f(x-k,y-l),(k,l∈W)}

    g =med[2,4,8;1,3,9;5,7,6] = 5

    中值滤波后的结果:

             
             
       

    5

       
             
             

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

    均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。

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

             
     

    2

    4

    8

     
     

    1

    3

    9

     
     

    5

    7

    6

     
             

    gxy=1/m ∑fxy

    g = (1/8)*(2+4+8+1+9+5+7+6)= 5

    均值滤波后的结果

             
             
       

    5

       
             
             

     

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

    2.  MATLAB实现

    源码:

    %%-------------------------------------------------------------------------------------------

    %% 2018/01/03

    %% lee

    %% 137194782@qq.com

    %% 微信公众号:FPGA开源工作室

    %%--------------------------------------------------------------------------------------------

    clear all;

    clc;

    M = imread('timg.jpg');         %读取MATLAB中的名为timg的图像   

    figure,imshow(M);                %显示原始图像

    title('original');

    gray = rgb2gray(M);

    figure,imshow(gray);                         %显示灰度图像

    title('gray');

    P1 = imnoise(gray,'gaussian',0.02);     %加入高斯躁声 

    figure,imshow(P1);                        %加入高斯躁声后显示图像

    title('gaussiannoise');

    P2 = imnoise(gray,'salt& pepper',0.02); %加入椒盐躁声

    figure,imshow(P2);                        %加入椒盐躁声后显示图像  

    title('salt& pepper noise');

    g = medfilt2(P1);                       %对高斯躁声中值滤波

    figure,imshow(g);

    title('medfiltergaussian');

    h = medfilt2(P2);                       %对椒盐躁声中值滤波

    figure,imshow(h);

    title('medfiltersalt & pepper noise');

    a=[1 1 1                               %对高斯躁声算术均值滤波

       1 11

       1 11];

    l=1/9*a;                          

    k = conv2(double(P1),double(l));                        

    figure,imshow(k,[]);

    title('arithmeticfiltergaussian');                                          

    d = conv2(double(P2),double(l));           %对椒盐躁声算术均值滤波              

    figure,imshow(d,[]);

    title('arithmeticfiltersalt & pepper noise');

    sigma=8;%标准差大小  

    window=double(uint8(3*sigma)*2+1);%窗口大小一半为3*sigma  

    H=fspecial('gaussian',window, sigma);%fspecial('gaussian',hsize, sigma)产生滤波模板   

    img_gauss=imfilter(P1,H,'replicate'); %为了不出现黑边,使用参数'replicate'(输入图像的外部边界通过复制内部边界的值来扩展)  

    figure, imshow(img_gauss);

    title('gaussianfilting gauss noise');

    img_salt=imfilter(P2,H,'replicate'); 

    figure, imshow(img_salt);

    title('gaussianfilting salt pepper noise');

     

    结果展示:

     

     

     

    原始图像

     

     

     

    灰度图像

     

     

     

    加入高斯噪声的灰度图像

     

     

     

    加入椒盐噪声的灰度图像

     

     

     

    经过中值滤波后的高斯噪声灰度图像

     

     

    经过中值滤波后的椒盐噪声灰度图像

     

     

    经过均值滤波的高斯噪声灰度图像

     

     

    经过均值滤波的椒盐噪声灰度图像

     

     

    经过高斯滤波的高斯噪声灰度图像

    经过高斯滤波的椒盐噪声的灰度图像

    结果分析:图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大程度的模糊化,原图好像被加上了一层蒙版。

     

    欢迎大家关注我的微信公众号FPGA开源工作室

    FPGA自习学院将不断更新和总结FPGA相关学习资料,书籍,实例工程和视频。

    欢迎大家加入FPGA自习学院,一起学习一起成长。

     

     

     

     

     

    展开全文
  • 中值滤波

    2021-04-02 02:00:54
    中值滤波.rar 介绍了关于中值滤波的详细说明,提供电气技术的技术资料的下载。
  • 中值滤波demo2.2. 双边滤波demo结构体参考 一. 线性滤波 1.1. 方框滤波 方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。 通用的滤波kernel如下: 这里是一个长宽...

    一. 线性滤波

    在这里插入图片描述

    1.1. 方框滤波

    方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。
    通用的滤波kernel如下:
    在这里插入图片描述

    这里是一个长宽分别为Kwidth和Kheight的窗口函数,在此区域内邻域中像素值叠加求平均即可求出位于kernel中心点像素的像素值。

    / ** @brief使用框过滤器模糊图像。
     该函数使用内核对图像进行平滑处理:
     未归一化的框式滤波器可用于计算每个像素邻域的各种积分特征,
     例如图像导数的协方差矩阵(用于密集光流算法等)。
     如果需要在可变大小的窗口上计算像素总和,请使用#integral。
    
    @param src输入图像。
    @param dst输出图像的大小和类型与src相同。
    @param ddepth输出图像深度(使用src.depth()时为-1)。
    @param ksize模糊内核的大小。一般Size(w,h)来表示内核的大小。 
    @param 锚点(即被平滑的那个点);默认值Point(-1,-1)表示锚点位于内核中心。
    @param normalize标志,指定是否通过内核区域对其进行规范化。
    @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes
    * /
    
    CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                                 Size ksize, Point anchor = Point(-1,-1),
                                 bool normalize = true,
                                 int borderType = BORDER_DEFAULT );
    

    boxFilter()函数方框滤波所用的核为:

    在这里插入图片描述

    其中:

    在这里插入图片描述

    当normalize=true的时候,方框滤波就变成了下面要说的的均值滤波。

    demo

    int MPT_test_boxFilter()
    {
    	cv::Mat dst1, dst2, dst3, dst4;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::boxFilter(src, dst1, -1, cv::Size(5, 5), cv::Point(-1, -1), true);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    	cv::namedWindow("方框滤波", 0);
    	cv::imshow("方框滤波", dst1);
    	cv::waitKey(0);
    	return 0;
    }
    

    d

    1.2. 均值滤波

    均值滤波的原理非常简单,就是输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。

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

    / ** @brief使用标准化框过滤器模糊图像。
    
    该函数使用内核对图像进行平滑处理:
    @param src输入图像; 它可以具有任意数量的通道,这些通道是独立处理的,但是深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
    @param dst输出图像的大小和类型与src相同。
    @param ksize模糊内核大小。
    @param锚点; 默认值Point(-1,-1)表示锚点位于内核中央。
    @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes
    */
    CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                            Size ksize, Point anchor = Point(-1,-1),
                            int borderType = BORDER_DEFAULT );
    

    demo

    //均值滤波
    int MPT_test_blur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::blur(src, dst, cv::Size(5, 5));
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("均值滤波", 0);
    	cv::imshow("均值滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    
    

    在这里插入图片描述

    1.3. 高斯滤波

    图像的高斯模糊过程就是图像与服从二维正态分布的卷积核做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
    图像与圆形卷积核做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波操作。
    高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

    一维零均值高斯函数为:

    在这里插入图片描述
    其中,高斯分布参数σ决定了高斯函数的宽度。

    对于二维图像来说,常用二维零均值离散高斯函数作平滑滤波器。
    二维高斯函数为:

    在这里插入图片描述

    / ** @brief使用高斯滤镜模糊图像。
    
    该函数将源图像与指定的高斯内核进行卷积。就地过滤是
    支持的。
    
    @param src输入图像;图像可以具有任意数量的经过处理的通道
    但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
    @param dst输出图像的大小和类型与src相同。
    @param ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数。或者,它们可以为零,然后根据sigma计算得出。
    @param sigmaX X方向上的高斯核标准偏差。
    @param sigmaY Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出(有关详细信息,请参见#getGaussianKernel);为了完全控制结果,而不考虑将来可能对所有这些语义的修改,建议指定所有ksize,sigmaX和sigmaY。
    @param borderType像素外推方法,请参见#BorderTypes
    */
    
    CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                    double sigmaX, double sigmaY = 0,
                                    int borderType = BORDER_DEFAULT );
    

    demo

    //高斯滤波
    int MPT_test_GaussianBlur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::GaussianBlur(src, dst, cv::Size(5, 5), 0, 0);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("高斯滤波", 0);
    	cv::imshow("高斯滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    

    在这里插入图片描述

    二. 非线性滤波

    非线性滤波器的原始数据与滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的。

    2.1. 中值滤波

    中值滤波原理:

    在这里插入图片描述

    简言之中值滤波就是把函数框(如图中的3 X 3)内的灰度值按顺序排列,然后中值取代函数框中心的灰度值。所以一般采用奇数点的邻域来计算中值,但如果像素点数为偶数,中值就取排序像素中间两点的平均值。

    中值滤波在一定的条件下可以克服常见线性滤波器如方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

    但是中值滤波的缺点也很明显,因为要进行排序操作,所以处理的时间长,是均值滤波的5倍以上。

    / ** @brief使用中值滤镜模糊图像。
    @note中值过滤器内部使用#BORDER_REPLICATE来处理边框像素,请参阅#BorderTypes
    
    @param src输入1、3或4通道图像;当ksize为3或5时,
    图像深度应为CV_8U,CV_16U或CV_32F,对于较大的光圈,只能为CV_8U。
    @param dst目标数组,其大小和类型与src相同。
    @param ksize孔径线性大小; 它必须是奇数且大于1,例如:3、5、7 ...
    */
    
    CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
    

    demo

    //中值滤波
    int MPT_test_medianBlur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::medianBlur(src, dst, 9);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("中值滤波", 0);
    	cv::imshow("中值滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    

    在这里插入图片描述

    2.2. 双边滤波

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

    双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

    下图是双边滤波的原理示意图:

    在这里插入图片描述

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

    在这里插入图片描述

    而加权系数w(i,j,k,l)取决于空域核和值域核的乘积。
    (i,j),(k,l)分别指两个像素点的坐标。
    其中空域核表示如下(如图):

    在这里插入图片描述

    值域核表示为:

    在这里插入图片描述

    两者相乘后,就会产生依赖于数据的双边滤波权重函数:

    在这里插入图片描述

    d函数是根据像素距离选择权重,距离越近权重越大,这一点和方框滤波,高斯滤波方式相同。而r函数则是根据像素的差异来分配权值。如果两个像素值越接近,即使相距较远,也比差异大而距离近的像素点权重大。正是r函数的作用,使得边缘,即相距近但差异大的像素点的特性得以保留。

    / ** @brief将双边过滤器应用于图像。
    可以在保持边缘相当清晰的同时很好地减少不必要的噪音。但是,与大多数过滤器相比,它非常慢。
    
    _Sigma values_:为简单起见,您可以将2个sigma值设置为相同。如果它们很小(<10),则滤镜效果不大;
    而如果它们很大(> 150),它们将具有非常大的效果。效果强,使图像看起来“卡通化”。
    
    _Filter size_:大型滤镜(d > 5)非常慢,因此建议实时使用d = 5
    应用程序,对于需要重噪声过滤的脱机应用程序,d = 9。
    
    @param src  源8位或浮点,1通道或3通道图像。
    @param dst  与src大小和类型相同的目标映像。
    @param d    滤波期间使用的每个像素邻域的直径。如果它不是正值,
                则从sigmaSpace计算得出。
    @param sigmaColor 在色彩空间中过滤sigma。  
                这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域
    @param sigmaSpace 在坐标空间中过滤sigma。
                该参数的值越大,表示越远的像素就会相互影响,
                只要它们的颜色足够接近即可(请参见sigmaColor)。
                当d > 0时,它指定邻域大小,而不考虑sigmaSpace。
                否则,d为与sigmaSpace成比例。
    @param borderType 用于推断图像外部像素的边框模式,请参阅#BorderTypes
     
    */
    
    CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                       double sigmaColor, double sigmaSpace,
                                       int borderType = BORDER_DEFAULT );
    
    

    demo

    //双边滤波
    int MPT_test_bilateralFilter() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::bilateralFilter(src, dst, 25, 10.0, 25);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    	cv::namedWindow("双边滤波", 0);
    	cv::imshow("双边滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    
    

    在这里插入图片描述

    结构体参考

    enum BorderTypes {
        BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
        BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
        BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
        BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
        BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
        BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`
    
        BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
        BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
        BORDER_ISOLATED    = 16 //!< do not look outside of ROI
    };
    
    展开全文
  • 本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下: 1.图像平滑 2.均值滤波 3.方框滤波 4.高斯滤波 5.中值...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    前文参考:
    [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
    [Python图像处理] 二.OpenCV+Numpy库读取与修改像素
    [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理

    本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下:
    1.图像平滑
    2.均值滤波
    3.方框滤波
    4.高斯滤波
    5.中值滤波

    PS:本文介绍图像平滑,想让大家先看看图像处理的效果,后面还会补充一些基础知识供大家学习。文章参考自己的博客及网易云课堂李大洋老师的讲解,强烈推荐大家学习。

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

    一.图像平滑

    1.图像增强
    图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)

    2.图像平滑
    图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
    简单平滑-邻域平均法

    3.邻域平均法
    图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
    但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。

    首先给出为图像增加噪声的代码。

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    rows, cols, chn = img.shape
    
    #加噪声
    for i in range(5000):    
        x = np.random.randint(0, rows) 
        y = np.random.randint(0, cols)    
        img[x,y,:] = 255
    
    cv2.imshow("noise", img)
               
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下所示:



    二.均值滤波

    1.原理
    均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值。例如下图中,红色点的像素值为蓝色背景区域像素值之和除25。

    其中红色区域的像素值均值滤波处理过程为: ((197+25+106+156+159)+ (149+40+107+5+71)+ (163+198+**226**+223+156)+ (222+37+68+193+157)+ (42+72+250+41+75)) / 25

    其中5*5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像。

    提取1/25可以将核转换为如下形式:

    2.代码
    Python调用OpenCV实现均值滤波的核心函数如下:
    result = cv2.blur(原始图像,核大小)
    其中,核大小是以(宽度,高度)表示的元祖形式。常见的形式包括:核大小(3,3)和(5,5)。
    K=19[111111111](1) K=\frac{1}{9}\left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] \tag{1}
    K=125[1111111111111111111111111](2) K=\frac{1}{25}\left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right] \tag{2}

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #均值滤波
    result = cv2.blur(source, (5,5))
     
    #显示图形
    titles = ['Source Image', 'Blur Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    输出结果如下图所示:

    核设置为(10,10)和(20,20)会让图像变得更加模糊。

    如果设置为(1,1)处理结果就是原图,核中每个权重值相同,称为均值。



    三.方框滤波

    方框滤波和均值滤波核基本一致,区别是需不需要均一化处理。OpenCV调用boxFilter()函数实现方框滤波。函数如下:
    result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
    其中,目标图像深度是int类型,通常用“-1”表示与原始图像一致;核大小主要包括(3,3)和(5,5),如下所示。

    K=19[111111111](3) K=\frac{1}{9}\left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right] \tag{3}
    K=125[1111111111111111111111111](4) K=\frac{1}{25}\left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right] \tag{4}

    normalize属性表示是否对目标图像进行归一化处理。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255。

    在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #方框滤波
    result = cv2.boxFilter(source, -1, (5,5), normalize=1)
     
    #显示图形
    titles = ['Source Image', 'BoxFilter Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    代码中使用5*5的核,normalize=1表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:

    下面是图像左上角处理前后的像素结果:

    print(source[0:3, 0:3, 0])
    #[[115 180 106]
    # [ 83 152  72]
    # [ 55  58  55]]
    print(result[0:3, 0:3, 0])
    #[[92 90 78]
    # [92 89 77]
    # [82 80 72]]
    

    如果省略参数normalize,则默认是进行归一化处理。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色。

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #方框滤波
    result = cv2.boxFilter(source, -1, (5,5), normalize=0)
     
    #显示图形
    titles = ['Source Image', 'BoxFilter Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show() 
    

    输出结果如下图所示:

    上图很多像素为白色,因为图像求和结果几乎都是255。如果设置的是2*2矩阵,只取四个像素结果要好些。
    result = cv2.boxFilter(source, -1, (2,2), normalize=0)



    四.高斯滤波

    为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
    图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3 * 3 和 5 * 5 领域的高斯模板。

    高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

    Python中OpenCV主要调用GaussianBlur函数,如下:
    dst = cv2.GaussianBlur(src, ksize, sigmaX)
    其中,src表示原始图像,ksize表示核大小,sigmaX表示X方向方差。注意,核大小(N, N)必须是奇数,X方向方差主要控制权重。

    K(3,3)=[0.050.10.050.10.40.10.050.10.05](5) K(3,3)=\left[ \begin{matrix} 0.05 & 0.1 & 0.05 \\ 0.1 & 0.4 & 0.1 \\ 0.05 & 0.1 & 0.05 \end{matrix} \right] \tag{5}
    K(5,5)=[1121113431248421343111211](4) K(5,5)=\left[ \begin{matrix} 1 & 1 & 2 & 1 & 1 \\ 1 & 3 & 4 & 3 & 1 \\ 2 & 4 & 8 & 4 & 2 \\ 1 & 3 & 4 & 3 & 1 \\ 1 & 1 & 2 & 1 & 1 \\ \end{matrix} \right] \tag{4}

    代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
    source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
     
    #高斯滤波
    result = cv2.GaussianBlur(source, (3,3), 0)
    
    #显示图形
    titles = ['Source Image', 'GaussianBlur Image']  
    images = [source, result]  
    for i in xrange(2):  
       plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    输出结果如下所示:

    如果使用15*15的核,则图形将更加模糊。



    五.中值滤波

    1.概念
    在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。 例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:

    如下图所示,将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。

    2.代码
    OpenCV主要调用medianBlur()函数实现中值滤波。图像平滑里中值滤波的效果最好。
    dst = cv2.medianBlur(src, ksize)
    其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。

    代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('test01.png')
     
    #高斯滤波
    result = cv2.medianBlur(img, 3)
    
    #显示图像
    cv2.imshow("source img", img)
    cv2.imshow("medianBlur", result)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。中值滤波对于消除孤立点和线段的干扰十分有用,尤其是对于二进噪声,但对消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波。

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
    (By:Eastmount 2018-09-01 早8点 https://blog.csdn.net/Eastmount/)


    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

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

    2020-01-18 11:52:03
    matlab实现中值滤波·
  • 中值滤波verilog代码

    2020-09-25 21:07:21
    verilog编写的中值滤波 verilog编写的中值滤波 verilog编写的中值滤波 verilog编写的中值滤波
  • 中值滤波matlab程序

    2021-04-11 21:30:16
    matlab下的中值滤波技术,可以直接运行 matlab下的中值滤波技术,可以直接运行 matlab下的中值滤波技术,可以直接运行 matlab下的中值滤波技术,可以直接运行
  • 中值滤波.rar

    2019-10-21 21:40:58
    中值滤波rar,中值滤波
  • 图像平滑处理-中值滤波

    万次阅读 多人点赞 2018-11-06 15:57:18
    图像平滑处理-中值滤波1.什么是滤波?2.平滑处理的目的3.平滑处理的应用4.中值滤波的处理方法5.中值滤波的示意图椒盐噪声6.椒盐处理和中值滤波的效果展示7.代码(面向过程)8.程序演示(面向对象) 1.什么是滤波? ...

    1.什么是滤波?

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

    消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

    2.平滑处理的目的

    图像滤波的目的有两个:

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

    而对滤波处理的要求也有两条:

    一是不能损坏图像的轮廓及边缘等重要信息;
    二是使图像清晰视觉效果好。

    3.平滑处理的应用

    关于滤波器,一种形象的比喻法是:
    我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

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

    4.中值滤波的处理方法

    中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。

    中值滤波首先也得生成一个滤波模板,将该模板内的各像素值进行排序,生成单调上升或单调下降的二维数据序列,二维中值滤波输出为

    g(x, y)=medf{f(x-k, y-1),(k, l∈w)}

    	其中f(x,y)和g(x,y)分别是原图像和处理后图像, w为输入的二维模板,能够在整幅图像上滑动,通常尺寸为3*3或5*5区域,也可以是不同的形状如线状、圆形、十字形、圆环形等。通过从图像中的二维模板取出奇数个数据进行排序,用排序后的中值取代要处理的数据即可。 
    

    5.中值滤波的示意图

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

    引用

    中值滤波示意图

    椒盐噪声

    椒盐噪声(salt-and-pepper noise)是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
      所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单。
      椒盐噪声往往由图像切割引起,去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。大量的实验研究发现,由摄像机拍摄得到的图像受离散的脉冲、椒盐噪声和零均值的高斯噪声的影响较严重。噪声给图像处理带来很多困难,对图像分割、特征提取、图像识别等具有直接影响。因此,实时采集的图像需进行滤波处理。消除图像中的噪声成份叫做图像的平滑化或滤波操作。滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;二是为适应计算机处理的要求,消除图像数字化时所混入的噪声。对滤波处理的要求有两条:一是不能损坏图像轮廓及边缘等重要信息;二是使图像清晰,视觉效果好。

    我们使用信噪比(Signal NoiseRate)衡量图像噪声,图象的信噪比应该等于信号与噪声的功率谱之比,但通常功率谱难以计算,有一种方法可以近似估计图象信噪比,即信号与噪声的方差之比(其实在均值为零的情况下,功率就是方差)。首先计算图象所有像素的局部方差,将局部方差的最大值认为是信号方差,最小值是噪声方差,求出它们的比值,再转成dB数,最后用经验公式修正。

    6.椒盐处理和中值滤波的效果展示

    在这里插入图片描述

    7.代码(面向过程)

    #%matplotlib inline
    from matplotlib import pyplot as plt
    import cv2
    import numpy as np
    from copy import deepcopy
    
    
    filename = input("请输入图像名称:")
    winname = "figure"
    img = cv2.imread(filename)
    
    def add_salt_noise(img, snr=0.5):
        # 指定信噪比
        SNR = snr
        # 获取总共像素个数
        size = img.size
        print(size)
        # 因为信噪比是 SNR ,所以噪声占据百分之10,所以需要对这百分之10加噪声
        noiseSize = int(size * (1 - SNR))
        # 对这些点加噪声
        for k in range(0, noiseSize):
            # 随机获取 某个点
            xi = int(np.random.uniform(0, img.shape[1]))
            xj = int(np.random.uniform(0, img.shape[0]))
            # 增加噪声
            if img.ndim == 2:
                img[xj, xi] = 255
            elif img.ndim == 3:
                img[xj, xi] = 0
        return img
    
    img_demo = deepcopy(img)
    snr = float(input("请输入一个信噪比(小数表示):"))
    img_salt = add_salt_noise(img_demo, snr)
    img_medianblur = cv2.medianBlur(img, 11)
    
    img_all = np.hstack([
        img, img_salt, img_medianblur
    ])
    
    plt.figure(figsize=(20,10))
    plt.imshow(img_all[:,:,::-1])
    plt.show()
    
    

    8.程序演示(面向对象)

    用tkinter 做的界面化处理操作

    面向对象制作的界面程序处理中值滤波

    完整代码(码云):码云分享
    完整代码(github):github分享

    觉得不错的朋友,可以与我交流关注,以及去码云和github点星,真的感谢!~

    有问题可以联系

    展开全文
  • 中值滤波&均值滤波

    2018-11-09 10:54:51
    该滤波边缘使用邻近值填充,结果图像不会出现黑边,中值滤波对椒盐噪声效果较好,均值滤波对高斯噪声效果较好,本资源提供了,中值滤波和均值滤波的实现,以及测试代码。

空空如也

空空如也

1 2 3 4 5 ... 20