opencv学习小结(1)–高斯模糊与卷积核、模糊半径

2024-05-14 21:18

本文主要是介绍opencv学习小结(1)–高斯模糊与卷积核、模糊半径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为做的项目需要用到opencv的工具包,所以本人就开始了对opencv的各类函数进行原理上的学习,希望能够尽快的完成对opencv系统的学习。

1:什么是高斯模糊:

模糊是一种利用图像算法对源图像素色值进行重新合成的一种处理结果(当然也是近视眼就会导致模糊..xixi),而高斯模糊则是运用高斯函数(遵循数据正态分布)求出对应图像的卷积核在进行一定换算最后合成图像的一种特殊处理结果,当然其中有很多过程及概念,先简单了解一下高斯模糊成像的过程是怎么样的:

1:卷积核:

一看非常高大上的名字,它其实就是通过某种算法得出的一个结果矩阵,我们知道图像其实就是一个二维的矩阵排列,通过高斯函数求出来的卷积核(矩阵)在与源矩阵进行一定的换算就得出结果矩阵就是我们最后模糊的图像结果,效果如图所示:

示例1

假设我们先不关心卷积核的生成,那么他是如何通过卷积核生成结果矩阵的呢:如图中所示:如果要求出结果矩阵的第2排第2列中的元素值需要将卷积核矩阵对准源矩阵中对应的像素元素也就是source pixel中的6(3*3的矩阵),然后通过求出加权的和也就是(-1*3)+(0*0)+(1*1)+(-2*2)+(0*6)+(2*2)+(-1*2)+(0*4)+(1*1)结果为-3,那么结果矩阵里的第2排第2列的元素值为-3;是不是感觉就是那么回事,其实的确就是那么回事,通过高斯函数求出的卷积核(也称滤波器)在进行加权求和就得出运算之后的图像了,那么现在知道模糊成像的这么一个过程,我们应该继续探索高斯求出的卷积核是怎么求出来的!

2:模糊的原理

我们知道了模糊的一个过程那么我们应该知道模糊的简单原理是什么样的还是画图理解更好解释:

示例2

如上图所示,如果我们想对中心元素点2进行一个模糊处理那么应该怎么做,既然是模糊那么就是通过周边元素的值来确定自己应该是多少,显然照上图来看的话我们模糊很简单就是求出周边的加权平均,结果就是1了(就像扫雷一样)

即(1+1+1+1+2+1+1+1+1)/9=1,如下:

示例3

这样得出的结果就已经是经过简单模糊的图像的了,当然实际操作不可能通过这么简单的运算来得出模糊图像,因为不管从效率还是实际的模糊效果来说都太差了,那么我们应该去学习更高级的权重分配模式了。在统计学里有一个影响深远的权重分配模式叫“正态分布”,在高斯模糊中也正是遵循正态分布来求出适应的模糊值,那么我们就了解一下正态分布是什么东西吧

正态分布的权重

一维的正态分布图

二维的正态分布图(图像都是二维)

首先我们来看一下正态分布是个什么样子,在统计学中正态分布应用在很多地方如医学,建筑等领域,从图中我们可以看出距离中心0zero的位置越小取值越大,曲度越大,处于中心点则是最高权重,位于周边则取值递减,也更加符合只有距离模糊像素越近的像素才有更高的权重思路,这种做法就避免了如果模糊像素与周边像素颜色差值过大造成的模糊效果不尽人意的问题;

权重矩阵(可以理解为卷积核)

如果理解了正态分布的权重分配我们可以继续往下来讲,如果我们在实际对图像做处理的时候其实就是对图像矩阵做处理,图像都是由很多像素排列的矩阵形成的图像,那么权重矩阵该怎么分配呢,很简单就是利用像素点的坐标值通过高斯函数对每个像素点进行运算得出每个像素点的权重值

二维的高斯函数公式

其中x,y代表当前模糊像素点的坐标值,σ代表是模糊半径(指的就是你中心点与周围像素的距离取值),有了这个公式那么算出权重矩阵那就是没那么复杂了,举个栗子,如图:

5*5的卷积核也就是权重矩阵

如果要构建一个模糊半径为2的权重矩阵那么他的矩阵应该是(2*2+1)*(2*2+1),为什么要加1呢是因为作为权重矩阵往往都是奇数矩阵,通常来讲这是为了能有一个中心点,如果不是奇数那么中心点的半径就不是统一的,例如如果是2*2的矩阵那么就无法确定准确的中心点位置,奇数刚好可以解决这个问题;有了这个矩阵我们就可以开始利用高斯函数来进行计算了,将x,y带入函数中,利用java的数学操作可以求出中心点(0,0)及周边的像素点的权重值: sigma(模糊半径)

 

函数在代码中的体现

最后通过每个对矩阵里的每个像素点进行运算求出的矩阵:

权重矩阵

这样我们的权重矩阵也就是卷积核就大功告成了,当然还没有完,假设我们有一个图像矩阵也就是未经过处理的图像矩阵,他们的色值如下图所示:

这个色值值得是图像的RGB色值,那么我们将权重矩阵对准源图像的色值矩阵将权重矩阵和色值矩阵相乘得出个结果全部加起来就可以求出中心的模糊值

这篇关于opencv学习小结(1)–高斯模糊与卷积核、模糊半径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989875

相关文章

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor