OpenCV 2.4+ C++ 平滑处理

  • 时间:
  • 浏览:1
  • 来源:大发快3_快3娱乐_大发快3娱乐

OpenCV 2.4+ C++ 平滑补救

2012-11-21 15:45  Justany_WhiteSnow  阅读(...)  评论()  编辑  收藏

原理

平滑也称模糊, 是一项简单且使用频率很高的图像补救最好的法子。

平滑补救需用用用到俩个 多 滤波器。 最常用的滤波器是线性滤波器,线性滤波补救的输出像素值(类似:)是输入像素值(类似:)的加权平均:

    

称为核, 它仅仅是俩个 多 加权系数。

均值平滑

下面是俩个 多 使用blur函数的均值平滑:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace cv;

int main( int argc, char** argv ){
    Mat image;
    image = imread( argv[1]);

    if( argc != 2 || !image.data ){
        printf("那么

图片\n");
        return -1;
    }
    
    namedWindow( "平滑补救-输入" );
    namedWindow( "平滑补救-输出" );
    
    imshow( "平滑补救-输入", image );
    
    Mat out;
    
    blur( image, out, Size(3, 3));

    imshow( "平滑补救-输出", out );

    waitKey( 0 );    
}

blur函数API资料:

使用归一化块滤波器进行模糊图片操作。

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
参数
  • src – 输入图片,可不可以 使是任意通道数,该函数对通道是独立补救的,而且 深度只有是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。
  • dst – 输出图片,和输入图片相同大小和深度。
  • ksize – 模糊内核大小。
  • anchor – 锚点,默认值是(-1,-1),也倘若锚点在内核的中心。
  • borderType – 用于判断图像边界的模式。

该函数对图片进行平滑补救利用了下面的内核:

调用blur(src, dst, ksize, anchor, borderType)合适调用boxFilter(src, dst, src.type(), anchor, true, borderType)。

blur使用的是归一化块滤波器,输出像素值是核窗口内像素值的均值( 所有像素加权系数相等)。

高斯平滑

下面代码使用了GaussianBlur来实现平滑:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
    Mat image;
    image = imread( argv[1]);

    if( argc != 2 || !image.data ){
        printf("那么

图片\n");
        return -1;
    }
    
    namedWindow( "平滑补救-输入" );
    namedWindow( "平滑补救-输出" );
    
    imshow( "平滑补救-输入", image );
    
    Mat out;
    
    GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );

    imshow( "平滑补救-输出", out );

    waitKey( 0 );    
}

GaussianBlur函数API资料:

使用高斯滤波器进行模糊操作

C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)
参数
  • src – 输入图片,可不可以 使是任意通道数,该函数对通道是独立补救的,而且 深度只有是CV_8UCV_16UCV_16SCV_32F or CV_64F.
  • dst – 输出图片,和输入图片相同大小和深度。
  • ksize – 高斯内核大小。ksize.widthksize.height允许不相同但亲戚一点人 需用是正奇数。原因分析分析等于0,由参数sigma的乘机决定。
  • sigmaX – 高斯内核在X方向的标准偏差。
  • sigmaY – 高斯内核在Y方向的标准偏差。原因分析分析sigmaY为0,他将和sigmaX的值相同,原因分析分析亲戚一点人 都为0,那么 亲戚一点人 由ksize.widthksize.height计算得出。
  • borderType – 用于判断图像边界的模式。

最有用的滤波器 (尽管总要最快的)。 高斯滤波是将输入数组的每俩个 多 像素点与高斯内核卷积将卷积和当作输出像素值。

参考一维高斯函数,亲戚亲戚一点人 可不可以 看见,他是个上方大两边小的函数。

也不高斯滤波器其加权数是上方大,四周小的。

其二维高斯函数为:

     

其中  为均值 (峰值对应位置), 代表标准差 (变量 和 变量 各有俩个 多 均值,也各有俩个 多 标准差)。

中值平滑

使用medianBlur执行中值平滑:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
    Mat image;
    image = imread( argv[1]);

    if( argc != 2 || !image.data ){
        printf("那么

图片\n");
        return -1;
    }
    
    namedWindow( "平滑补救-输入" );
    namedWindow( "平滑补救-输出" );
    
    imshow( "平滑补救-输入", image );
    
    Mat out;
    medianBlur( image, out, 3);

    imshow( "平滑补救-输出", out );

    waitKey( 0 );    
}

medianBlur函数API资料:

使用中值滤波器进行模糊操作

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
Parameters:
  • src – 支持1、3、4通道图片输入,当ksize为3原因分析分析5时,图片的深度只有是CV_8U,,CV_16U,原因分析分析 CV_32F,对于一点大孔径尺寸只支持深度为CV_8U。
  • dst – 输出图片,和输入图片相同大小和深度。
  • ksize – 线性直径大小,只有是俩个 多 大于1的奇数,类似:3, 5, 7 ...

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 。 

双边平滑

使用bilateralFilter执行双边平滑:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
    Mat image;
    image = imread( argv[1]);

    if( argc != 2 || !image.data ){
        printf("那么

图片\n");
        return -1;
    }
    
    namedWindow( "平滑补救-输入" );
    namedWindow( "平滑补救-输出" );
    
    imshow( "平滑补救-输入", image );
    
    Mat out;
    bilateralFilter ( image, out, 3, 3*2, 3/2 );

    imshow( "平滑补救-输出", out );

    waitKey( 0 );    
}

bilateralFilter的API资料:

对俩个 多 图片应用双边滤波器。

C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, intborderType=BORDER_DEFAULT )
Parameters:
  • src – 源需用是8位原因分析分析浮点数,1原因分析分析3通道图片。
  • dst – 输出图片,和输入图片相同大小和深度。
  • d – 在滤波过程中使用的各像素邻域直径,原因分析分析这是俩个 多 非整数,则這個 值由sigmaSpace决定。
  • sigmaColor – 颜色空间的标准方差。数值越大,原因分析分析越远的的颜色会被混进邻域内,从而使更大的颜色段获得相同的颜色。
  • sigmaSpace – 坐标空间的标注方差。 数值越大,以为着越远的像素会相互影响,从而使更大的区域足够类似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。而且 ,d正比于sigmaSpace

原理可参考:

http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

目前亲戚亲戚一点人 了解的滤波器总要为了平滑图像, 问题图片是一点但是什么滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为补救另俩个 多 的具体情况 (合适在一定程度上 ), 亲戚亲戚一点人 可不可以 使用双边滤波。 

类似高斯滤波器,双边滤波器也给每俩个 多 邻域像素分配俩个 多 加权系数。 什么加权系数涵盖俩个 多 每项, 第一每项加权最好的法子与高斯滤波一样,第二每项的权重则取决于该邻域像素与当前像素的灰度差值。

被山寨的原文

Smoothing Images . OpenCV.org

Image Filtering API . OpenCV.org

  • 分类 Computer Vision
  • 标签 OpenCV