高斯滤波是图像平滑的一种重要的方式,能有效地消除和抑制噪声,达到图像平滑的效果。同时,相比于平均模板而言,效果更加自然。更加自然的意思,实际上说相对于就是适当地降低平滑后的模糊程度。平均模板对四周像素的使用是一视同仁的,这样的话整幅图处理后看上去就会非常的模糊;然而高斯滤波打破了这样的局限,分配以不同的权重,随着距离中心距离的增大,权重将迅速减小,从而确保中心的像素点看起来更像是接近与它更近的像素点,这样图像的连续性得到了保证!
那么问题来了,什么是高斯滤波?
首先,它引入了数学中的高斯函数(正态分布函数)(对于平面图像来说,往往用到的是二维函数)
(式1-1)
高斯滤波的思路就是:对高斯函数进行离散化,以离散点上的高斯函数值为权值,对我们采集到的灰度矩阵的每个像素点做一定范围邻域内的加权平均,即可有效消除高斯噪声。
离散的高斯卷积核H: (2k+1)×(2k+1)维,其元素计算方法为:
(式1-2)
其中Sigma为方差,k确定核矩阵的维数。
通过上述公式,我们可以方便地求出高斯模板,从而进行编程滤波处理。这里不得不提高斯滤波有两种实现方式,其一是离散化窗口滑窗卷积,另一种则是通过傅里叶变化实现。本文只介绍前者,实际上前者运用也是最多的。那什么叫离散化窗口滑窗处理呢?我们把这个方法分成四个关键词:“离散化”“窗口”“滑窗”“卷积”,接下来一一解释这些名词:
“离散化”:上文中已经提到了离散的高斯卷积核(式1-2),实际上就是将高斯函数进行离散化,方便程序计算高斯模板;
“窗口”:这个窗口比喻得很形象,实际上我的理解就是M*N维的高斯模板;
“滑窗”:有了这个高斯模板,接下来是结合我们待处理的灰度数据,处理一个接着一个的像素点,比如说处理完(1,1)这个点之后,接下来要处理(1,2)这个数据点,那么模板相当于右移了一个像素点,那么我们可以把这个过程形象地看作是滑窗。在碰上待处理图像的边缘时,往往处理不了,此时要进行特殊处理,比如说在检测到边缘时,复制原来的灰度数据,即不处理;
“卷积”:在高数里有过这个概念,然而在这个地方,卷积远远没有书上的那么复杂,实际上就是待处理图像的各像素灰度数据与模板对应元素的数值的加权和的运算过程,就称之为卷积。
有了以上解释之后,我们可以把“离散化”和“窗口”看成是第一个步骤,可以称之为预处理,通过对高斯函数离散化得到的函数来编程得到你所需要的高斯模板,也就是窗口;把“滑窗”和“卷积”看作是第二个步骤,可以称之为处理过程,通过“滑窗”的方式来进行“卷积”过程。
上述两个过程在下一次笔记中我将详细论述。本文重点介绍openCV自带的高斯函数的运用。
void cvSmooth(const CvArr* src, CvArr* dst,
int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0,double param3=0, double param4=0 );
1
) 如果指定param1和param2,则代表核函数的行列,即为滤波窗口的宽度和高度;2) Param3:高斯卷积的Sigma值
3) 如果用户希望采用非对称的高斯核,则引入param4,最后两个参数分别代表水平核以及垂直核维数;
4) 如果param3没有给出,则有前两个参数param1和param2计算出Sigma。这里的根据是高斯分布的特点(如图所示,数值分布在(μ—3σ,μ+3σ)中的概率为0.9974),如果核矩阵更大,那么相应的Sigma也更大,相反,如果Sigma更大,那么核矩阵覆盖范围也更大。具体到OpenCv下,用如下公式进行计算(根据其源代码显示)。
处理代码如下:
#include<iostream>
#include"cv.h"
#include"highgui.h"
#include"cxcore.h"
using namespace std;
int main()
{
//载入一张待处理的图片
IplImage* img = cvLoadImage("10.png");
//创建一张自定义大小的图像,从而调整载入图像的大小
IplImage* myimg = cvCreateImage(cvSize(400,400),8,3);
//彩色图像转变灰度图像
IplImage* lastimg = cvCreateImage(cvSize(400, 400), 8, 1);
//*********************************************
//创建输出图像
IplImage* dst = cvCreateImage(cvSize(myimg->width,myimg->height),8,1);
//重新调整图像大小
cvResize(img, myimg);
//RGB图像转换成灰度图像
cvCvtColor(myimg, lastimg,CV_BGR2GRAY);
cvNamedWindow("scr");
cvNamedWindow("Guase Filter");
//用3*3的高斯模板,sigma=2进行高斯滤波
cvSmooth(lastimg,dst, CV_GAUSSIAN,3,3,2);
cvShowImage("scr", lastimg);
cvShowImage("Guase Filter", dst);
cvWaitKey(50000);
system("pause");
cvReleaseImage(&img);
cvReleaseImage(&dst);
cvReleaseImage(&myimg);
cvReleaseImage(&lastimg);
cvDestroyAllWindows();
return 0;
}
1.对彩色图像的处理
2.对灰度图像的处理
3.sigma不同的比较
先来看不同sigma取值时输出图像的不同效果:
(1)sigma=0.1
(2)sigma=0.5
(3)sigma=0.8
(4)sigma=1
(5)sigma=2
以上几组数据的比较,请读者仔细观察(一定要仔细观察,一开始粗略地看是看不出来很明显的差别,具体原因是素材的选择问题,抱歉),可以发现,当sigma=0.1时,实际上和原图效果并无很大差别,而反观sigma=2时,较原图来说,开始有些模糊的效果。实际上,仔细想想并不难理解,sigma表示的是标准差,如果标准差比较小,这是就相当于图像点运算,则平滑效果不明显;反之,标准差比较大,则相当于平均模板,比较模糊。故一般情况下3*3模板选择0.8标准差即可(该部分后面还会进一步阐述比较说明)。
相关推荐
本笔记将深入探讨OpenCV的基础概念、核心功能以及实际应用。 一、OpenCV基础 1. 安装与配置:OpenCV可以在Windows、Linux、Mac OS等多种操作系统上安装。通常,我们通过编译源码或者使用预编译的库来完成安装。...
OpenCV(开源计算机视觉库)是一个强大的图像和视频处理库,广泛应用于计算机视觉、图像分析和机器学习领域。它支持多种编程语言,包括 Python,使得在Python环境下进行图像处理变得更加便捷。本教程的目标是帮助...
计算机视觉学习笔记8-噪声与滤波 计算机视觉中,图像噪声是一个非常重要的问题,噪声的产生会严重影响图像质量。为了解决这个问题,需要对图像进行滤波处理。滤波是一种可以有效去除图像噪声的方法。常见的滤波方法...
在OpenCV的学习之旅中,首先我们要理解其基本概念和图像处理的方法。OpenCV是一个开源的计算机视觉库,广泛应用于图像处理、计算机视觉以及机器学习等领域。这篇笔记将带你轻松入门OpenCV,探索图像处理的奥秘。 **...
2. 图像处理操作:OpenCV支持多种图像处理操作,如灰度转换(`cv2.cvtColor()`)、直方图均衡化(`cv2.equalizeHist()`)、滤波(如高斯滤波`cv2.GaussianBlur()`)、边缘检测(Canny算法`cv2.Canny()`)等。...
在本篇AI学习笔记系列的第四章中,我们将聚焦于使用OpenCVSharp库在大图像中寻找小图像的实用技术。OpenCVSharp是OpenCV库的C#版本,它为计算机视觉任务提供了丰富的功能,包括图像处理、模式识别以及目标检测等。在...
这个压缩包文件“opencv教程个人学习笔记总结及C++示例.zip”显然是一个学习OpenCV的资料集合,其中包含了一些用C++编写的示例代码,帮助初学者理解和实践OpenCV的功能。 首先,我们来看看这些示例文件名,它们揭示...
这涵盖了《OpenCV3和Qt5 计算机视觉应用开发》一书中的第2章和第3章的核心概念及实践练习。OpenCV是一个强大的开源计算机视觉库,而Qt5则是一个广泛应用的跨平台UI框架,两者结合可以创建出具有视觉效果的用户界面。...
在本项目中,我们主要探讨如何使用Visual Studio 2008(Vs2008)结合OpenCV 2.3.1库来构建一个基于MFC(Microsoft Foundation Classes)的应用程序,以便操作笔记本摄像头并执行图像处理任务,如边缘检测。...
OpenCV(开源计算机视觉库)是一个强大的跨平台计算机视觉库,它被广泛应用于图像处理、计算机视觉以及机器学习等领域。Python是OpenCV的一个常见接口,提供了简洁易用的语法,使得开发者能快速实现复杂的视觉算法。...
这个压缩包文件"内置摄像头+高斯滤波+边沿检测.zip"显然包含了一个用于Windows平台的图形图像处理程序,旨在利用笔记本内置摄像头捕获图像,然后通过应用高斯滤波器平滑图像,接着进行边沿检测,以突出图像中的关键...
Emgu CV是一个跨平台的开源计算机视觉库,它为.NET开发者提供了与OpenCV相同的功能,包括图像处理、模式识别和机器学习算法。本文将重点介绍在C#中使用Emgu CV时的一些关键知识点,如二值化、灰度化、卷积、高斯模糊...
- 如果您对高斯滤波的数学原理感兴趣,可以进一步了解高斯核函数及其在图像处理中的应用。 - 形态学操作(如膨胀和腐蚀)是图像处理中的重要概念,深入了解这些操作可以帮助您更好地优化运动物体的边界检测。 - ...
在这个“opencv:学习笔记,机器视觉,记忆交流”的主题中,我们将深入探讨OpenCV 4.1.0版本在机器视觉领域的应用,以及如何利用C++进行编程实践。 首先,OpenCV 4.1.0是该库的一个稳定版本,它提供了大量的更新和...
这包括了基本的图像操作,如读取、显示、保存图像,以及常见的图像处理技术,如灰度化、直方图均衡化、色彩空间转换、滤波操作(如高斯滤波、中值滤波)。 此外,OpenCV中的特征检测和描述符是重要的组成部分,如...
在本教程中,我们将深入探讨如何使用Python编程语言与OpenCV2库来创建一个能够识别手势动作的应用程序。OpenCV(开源计算机视觉库)是一个强大的工具,广泛应用于图像处理和计算机视觉领域,包括手势识别、人脸识别...
例如,我们可以用它来调整图像的大小、色彩空间转换(如从RGB到灰度),以及应用滤波器(如高斯滤波)来平滑图像或消除噪声。 在Python中,OpenCV库通常通过`cv2`模块导入。例如,读取一个图像的代码如下: ```...
- **图像增强**:使用OpenCV的滤波函数(如高斯模糊、中值滤波)改善图像质量。 - **色彩空间转换**:如将BGR转换到HSV,便于颜色相关的处理,如颜色分割。 - **对象检测**:可能使用OpenCV的Haar级联分类器进行对象...
- 噪声去除:使用滤波器如高斯滤波、中值滤波等减少图像噪声。 - 归一化:调整图像的亮度和对比度,使其在处理时保持一致。 - 二值化:将图像转换为黑白两色,便于后续处理。 - 图像平滑:通过滤波降低图像细节...
《OpenCV4AndroidStudy:基于Android的OpenCV学习与实践》 OpenCV4AndroidStudy是一个专为Android开发者设计的学习资源,旨在帮助他们掌握如何在Android平台上利用OpenCV进行图像处理和计算机视觉应用开发。OpenCV...