• opencv(4)图像滤波


    都是一些常用函数,但是可能太常用了,里面的一些关键点,没做过多的研究,今天主要对函数中特殊的地方做出分析

    1.cvSmooth  图像滤波

    CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。 
    CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1?param2). 
    CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 
    CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的). 
    CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 

    (1)高斯滤波是利用高斯函数来进行图像滤波的一种方法,关于其原理可以参考网页:高斯滤波器 ,里面对高斯滤波器的参数做了说明,opencv中,核的大小通过param1*param2来定义(如果param2<=0,param2=param1),param3(X方向)和param4(Y方向)定义了高斯卷积核的尺寸,如果采用默认,高斯核将根据param1*param2来定义,关系如下:

     
    param3 param4决定了图像滤波的平滑程度,可以参考高斯滤波器 ,在同样标准差的情况下,尺寸越大,图像的平滑程度越好,也越模糊(全局性的),同样,同样尺寸的情况,标准差越大,图像也越模糊(局部性的),提供几张图像做参考,是对拍摄的静脉图像做滤波,里面的噪声比较大,很明显可以看出差异:


     

    (2)双边滤波能够很好的保留边缘信息,提供比高斯滤波更好的边缘保留特性,opencv提供的双线性滤波器的加权计算包含2个部分,一部分叫做space-related bilateral filter coefficients空域参数,一个是 color-related bilateral filter coefficients颜色域参数,空域参数采用高斯核来计算,颜色域参数是基于像素与中心像素的亮度差的差值的加权,相似的像素赋给较大的权值,不相似的赋予较小的权值,处理完的图像更像一个水彩画,可用于图像分割。算法的原理可以参考网页:原理,从频域看下图可以看得很明白

    opencv的文档对双边滤波说明(彩色 sigma=param1,空间 sigma=param2)是有错误的,实际上param1表示核宽度/2,param2没有使用,param3表示色彩域内高斯核的宽度,param4表示空间域的高斯核宽度。opencv的源码如下:

    View Code
    //cvsmooth函数
    cvSmooth( const void* srcarr, void* dstarr, int smooth_type,
              int param1, int param2, double param3, double param4 )
    {
        ...
    
        if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE )
             ...
        else if( smooth_type == CV_GAUSSIAN )
            ...
        else if( smooth_type == CV_MEDIAN )
           ...
        else
            cv::bilateralFilter( src, dst, param1, param3, param4, cv::BORDER_REPLICATE );
    }
    
    //双边滤波函数,可以很明白的看清楚参数传递过程了
    void bilateralFilter( const Mat& src, Mat& dst, int d,
                          double sigmaColor, double sigmaSpace,
                          int borderType )
    {
        dst.create( src.size(), src.type() );
        if( src.depth() == CV_8U )
            bilateralFilter_8u( src, dst, d, sigmaColor, sigmaSpace, borderType );
        else if( src.depth() == CV_32F )
            bilateralFilter_32f( src, dst, d, sigmaColor, sigmaSpace, borderType );
        else
            CV_Error( CV_StsUnsupportedFormat,
            "Bilateral filtering is only implemented for 8u and 32f images" );
    }
    
    //bilateralFilter函数部分

    下面几张图是我处理结果与高斯的对比:

    效果不是很明显,可以看一下别的网站的几张图片

    作者:细雨淅淅

    转载请注明地址:http://www.cnblogs.com/zsb517/archive/2012/06/06/2538891.html

  • 相关阅读:
    UVa12093
    UVa1631
    vue路由跳转的三种方式
    vue中的钩子函数(判断是否跳转页面)beforeEach
    vue中子组件向父组件传值方法?
    vue中对数组,对象的操作如下
    vue-router的beforeEach的使用?
    vue拦截器使用?
    vue中父子组件以及兄弟组件的传值情况?
    前端模块化?
  • 原文地址:https://www.cnblogs.com/zsb517/p/2538891.html
Copyright © 2020-2023  润新知