OpenCV笔记(七)——图像平滑的四种方法

Opencv中处理图像平滑的手段主要有4种:箱式滤波器、高斯滤波器、中值滤波器、双边滤波器。

1. 箱式滤波器 Normalized Box Filter

箱式滤波器将当前像素的值替换为所有kernel范围内像素的值的平均值。公式如下:

如果是3x3的核,则它对应的核是1/9 * [1, 1, 1; 1, 1, 1; 1, 1, 1]

OpenCV中的函数为:

void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1, -1), int borderType=BORDER_DEFAULT)

参数ksize就是kernel的尺寸。

anchor默认为Point(-1, -1),意味着以kernel的中心点为基准点进行滤波。在这里意义不大。

2. 高斯滤波器 Gaussian Filter

在高斯滤波器中,kernel范围内的像素所占的权重是高斯分布的值。kernel中心点的权重为高斯分布的中点的值。其余的像素所占的权重与它离中心点的距离成反比。

举个例子,对于一维高斯分布,G(x) = Ae-x^2/(2σ^2) ,在[-4, 4]的范围内,如果sigma=0.5,则一维高斯滤波器的系数为:[0.0 0.0 0.00026 0.10645 0.78645 0.10645 0.00026 0.0 0.0]

这个系数也比较好理解,因为在均值+3倍sigma之外的地方,高斯分布的概率基本为0。

当sigma=1.5时,系数为[0.00761 0.036075 0.10959 0.21345 0.26666 0.21345 0.10959 0.03608 0.00761]

而二维的高斯滤波器,可以对图像的行应用一维高斯滤波器,接着对图像的列应用相同的一维滤波器。这利用的是高斯滤波器的可分离特性。(此处参考《OpenCV2 计算机视觉编程手册》)

OpenCV中的函数为:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

参数ksize就是kernel的尺寸。

sigmaX是高斯分布在X方向上的标准差。

sigmaY默认为0,则与sigmaX相等。如果sigmaX和sigmaY均为零,则他们自动由getGaussianKernel()算出。

3. 中值滤波器 Median Filter

中值滤波器比较简单,就是在kernel的范围内,以中值点作为中心点的值。

OpenCV中的函数为:

void medianBlur(InputArray src, OutputArray dst, int ksize)

4. 双边滤波器 Bilateral Filter

双边滤波器的详细解释见:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html#Index

该滤波器的优点就是能够保留边缘的信息。缺点是速度较慢。

OpenCV中的函数为:

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

不知为不知,等看懂了再来解释~

时间: 2024-10-10 08:58:24

OpenCV笔记(七)——图像平滑的四种方法的相关文章

ThinkPHP学习笔记 实例化模型的四种方法

创建Action类 [php] <?php class NewObjectAction extends Action{ public function index(){ //1.创建一个基础模型 //      //一:实例化一个系统的数据库操作类 //      //new Model('User')相当于M('User'),在Model中放置一个需要操作的表 //      //1命名: //      //  thinkphp默认的有表名前缀,如果为think_user:则在Model中可

两个变量交换的四种方法(Java) 七种方法(JS)

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) 1 class TestEV 2 //创建一个类 3 { 4 public static void main(String[]args) 5 { 6 int x =5,y=10; //定义两个变量 7 8 int temp = x; //定义第三临时变量temp并提取x值 9 x = y; //把y的值赋给x 10 y = temp; //然后把临时变量temp值赋给y

两个变量交换的四种方法

对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. class TestEV //创建一个类 { public static void main(String[]args) { int x =5,y=10; //定义两个变量 int temp = x; //定义第三临时变量temp并提取x值 x = y; //把y的值赋给x y = temp; //然后把临时变量temp值赋给y System.out.println("x="+x

【找数组元素最大值的十四种方法】for【练习知识点和总结】

以下是心血成果,版权所有,未经允许,不得转载.作者:李金涛:FROM:光环国际 AT:201712172024.(方便以后,再次修改) <script> // 比较数组中数值的大小是比较常见的操作,比较大小的方法有多种,下面来介绍如下十四种方法,原理代码如下: // 1,排序取值:sort比较器排序(常用),以及冒泡排序(不常用,但方法思想很重要);// 2,假设比较取大值:假设max=arr[0];index=0; 在循环往后比较,如果有比max大的数就让max记录下大的数,索引赋给inde

转载:CSS实现三栏布局的四种方法示例

转载网址:http://www.jb51.net/css/529846.html 前言 其实不管是三栏布局还是两栏布局都是我们在平时项目里经常使用的,也许你不知道什么事三栏布局什么是两栏布局但实际已经在用,或许你知道三栏布局的一种或两种方法,但实际操作中也只会依赖那某一种方法,本文具体的介绍了三栏布局的四种方法,并介绍了它的使用场景. 所谓三栏布局就是指页面分为左中右三部分然后对中间一部分做自适应的一种布局方式. 1.绝对定位法 HTML代码如下: <div class="left&quo

java中定时器的四种方法

1 package com.lid; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 import java.util.Timer; 6 import java.util.TimerTask; 7 8 public class Test { 9 public static void main(String[] args) { 10 //timer1(); 11 timer2(); 12 //timer3(); 13 //time

自学Linux命令的四种方法

自学Linux命令的四种方法 导读 童鞋们刚接触linux时,在学习过程中中会遇到不少问题,学习linux摸不着头脑,那么下面介绍四种linux的学习方法,特别适合新手. 方法一:终端"每日提示" 在.bashrc中(/home/.bashrc)增加如下一行: echo "Did you know that:"; whatis$(ls /bin | shuf -n 1) 你只需要增加这行就够了!如果你想让它更娱乐化一些,你可以安装cowsay.Ubuntu/Debi

【转】Java中字符串中子串的查找共有四种方法(indexof())

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json. 本文将介绍TouchJso