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

相关文章

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Ollama Python 使用小结

《OllamaPython使用小结》Ollama提供了PythonSDK,使得开发者能够在Python环境中轻松集成和使用本地运行的模型进行自然语言处理任务,具有一定的参考价值,感兴趣的可以了解一... 目录安装 python SDK启动本地服务使用 Ollama 的 Python SDK 进行推理自定义客

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

SQL中的CASE WHEN用法小结

《SQL中的CASEWHEN用法小结》文章详细介绍了SQL中的CASEWHEN函数及其用法,包括简单CASEWHEN和CASEWHEN条件表达式两种形式,并通过多个实际场景展示了如何使用CASEWH... 目录一、简单CASE WHEN函数:二、CASE WHEN条件表达式函数三、常用场景场景1:不同状态展

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx