服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - OpenCV 2.4.3 C++ 平滑处理分析

OpenCV 2.4.3 C++ 平滑处理分析

2020-11-11 20:09C++教程网 C/C++

平滑也称模糊, 是一项简单且使用频率很高的图像处理方法,本文将详细介绍OpenCV 2.4+ C++ 平滑处理,需要了解更多的朋友可以详细参考下

原理

平滑也称模糊, 是一项简单且使用频率很高的图像处理方法。

平滑处理时需要用到一个滤波器。 最常用的滤波器是线性滤波器,线性滤波处理的输出像素值(例如:OpenCV 2.4.3 C++ 平滑处理分析)是输入像素值(例如:OpenCV 2.4.3 C++ 平滑处理分析)的加权平均:

    OpenCV 2.4.3 C++ 平滑处理分析

OpenCV 2.4.3 C++ 平滑处理分析称为核, 它仅仅是一个加权系数。

均值平滑

下面是一个使用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 – 用于判断图像边界的模式。

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

OpenCV 2.4.3 C++ 平滑处理分析

调用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 – 用于判断图像边界的模式。

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

OpenCV 2.4.3 C++ 平滑处理分析

参考一维高斯函数,我们可以看见,他是个中间大两边小的函数。

所以高斯滤波器其加权数是中间大,四周小的。

其二维高斯函数为:

    OpenCV 2.4.3 C++ 平滑处理分析

其中 OpenCV 2.4.3 C++ 平滑处理分析 为均值 (峰值对应位置),OpenCV 2.4.3 C++ 平滑处理分析 代表标准差 (变量OpenCV 2.4.3 C++ 平滑处理分析 和 变量OpenCV 2.4.3 C++ 平滑处理分析 各有一个均值,也各有一个标准差)。

中值平滑

使用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

目前我们了解的滤波器都是为了平滑图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。 

类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22