21.失真/低高通/振铃效应/旁瓣泄漏效应/频域滤波/图像深度/频带/线性滤波源码分析 -- OpenCV从零开始到图像(人脸 + 物体)识别系列

article/2025/4/21 15:11:58

本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

简书链接:https://www.jianshu.com/u/45da1fbce7d0


1.前言

本文你会找到以下问题的答案:

失真/低高通/振铃效应和旁瓣泄漏效应/图片深度/频带/图像细节/线性滤波源码分析

  1. 失真
  2. 低高通(和高低频什么关系?)
  3. 振铃效应
  4. 频域滤波
  5. 旁瓣效应
  6. 图像深度
  7. 频带

2.1 失真

失真,指失去本意或本来面貌;跟原来的有出入。(本来是RGB,现在是HIS,和原来不一样)

1.失真.jpg

2.2 低高通

1.低高通2

简单来说:

高通滤波:边缘提取与增强(锐化)

低通滤波:边缘平滑(模糊)

边缘区域的灰度变换加大,也就是频率较高。所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤;对于低通滤波,边缘区域将被平滑过渡。

1.锐化和平滑1

2.3 振铃效应

振铃效应(Ringingeffect)是影响复原图像质量的众多因素之一,是由于在图像复原中选取了不适当的图像模型造成的,振铃效应产生的直接原因是图像退化过程中信息量的丢失,尤其是高频信息的丢失,其严重降低了复原图像的质量,并且使得难于对复原图像进行后续处理。

(指图像的细节程度吧,比如细节较多或者说单位大小内的灰度(黑到白)变化较大则为高频,这是我个人的理解,第18篇有写高低频)

下图展示了在图像处理中,频率域下的理想低通滤波器在一定条件下将会导致图片出现振铃效应。

由卷积定理可知,频率域下的理想低通滤波器H(u, v)必定存在一个空间域下与之对应的滤波函数h(x, y),且可以通过对H(u,v)作傅里叶逆变换求得。(高斯函数第20篇,傅里叶第14-15篇,空间域第18篇,卷积第17篇)

不懂,上面说的不懂。(看2.4解释)

产生振铃效应的原因就在于,理想低通滤波器在频率域下的分布十分线性(在D0处呈现出一条垂直的线,在其他频率处呈现出一条水平的线),那么不难想象出对应的h(x,y)将会有类似于sinc函数那样周期震荡的空间分布特性。正是由于理想低通滤波器的空间域表示有类似于sinc函数的形状,位于正中央的突起使得理想低通滤波器有模糊图像的功能,而外层的其他突起则导致理想低通滤波器会产生振铃效应。

2.振铃

a为原图,其他都出现不同程度的振铃效应

均值平滑模板具有旁瓣泄漏效应,反应在图像中就是振铃效应,且模板尺寸越大,振铃效应也就越明显。(简单说:均值滤波,(h(x,y)为核)核越大,细节越多的丢失越严重,失真)

2.1 核

2.4 频域滤波(小嗷又忘了傅里叶变换是什么?)

2.4无

傅里叶又有啥子用?就上篇高斯滤波?好像和高斯滤波毛关系都没有.

等等说了这么多,我们都没有试过通过频域去除特定的频率达到滤波。小嗷没记错的话.

2.4.1 频域滤波

2.4.2 频域滤波

2.4.3 频域滤波

2.4.4 频域滤波

2.4.5 频域滤波

2.4.6 频域滤波

详情网址:

http://www.docin.com/p-1995963253.html

2.5 旁瓣效应(小嗷也看不懂它和均值滤波有啥关系,大概是涉及到傅里叶变换到频域)

补零对频谱的影响:(频谱第14篇傅里叶里写道)

进行zero padding只是增加了数据的长度,而不是原信号的长度。就好比本来信号是一个周期的余弦信号,如果又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补的0并没有带来新的信息。其实zero padding等价于频域的sinc函数内插,而这个sinc函数的形状(主瓣宽度)是由补0前的信号长度决定的,补0的作用只是细化了这个sinc函数,并没有改变其主瓣宽度。而频率分辨率的含义是两个频率不同的信号在频率上可分,也就要求它们不能落到一个sinc函数的主瓣上。所以,如果待分析的两个信号频率接近,而时域长度又较短,那么在频域上它们就落在一个sinc主瓣内了,补再多的0也是无济于事的。

泄露是由于非整周期采样引起的,因为FFT最精确的是将周期信号映射到一个正交函数空间上(傅立叶变换常用三角函数空间),对周期性信号,只要是整周期采样(采样周期是信号周期的整数倍数描述不对,应该说采样时间长是信号周期的整数倍),是没有谱泄露的,对于非周期信号,无法达到整周期采样,所以总会有泄露,选择合适的窗函数可以控制泄露的严重程度。

混叠是采样频率与信号最高频率的关系引起的,满足采样定理,即采样频率〉=2倍信号最高频率,即可避免混叠,实际信号都受噪声干扰,白噪声是宽带的,所以采样频率即便很高,都不可避免地存在混叠,只是混叠程度小些,满足工程应用。再者,(采样频率可以看做核)

采样频率不是越高越好(核的大小),采样点数有限的情况下,采样频率与频率分辨率是相互矛盾的。

结论:均值平滑模板对应的频域滤波函数具有旁瓣泄漏的性质,因而导致振铃效应。

2.6 图像深度

图像深度是指存储每个像素所用的位数,也用于量度图像的色彩分辨率。

图像深度确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数.

它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级。

比如一幅单色图像,若每个像素有8位 ,则最大灰度数目为2的8次方,即256。一幅彩色图像RGB3个分量的像素位数分别为4,4,2,则最大颜色数目为2的4+4+2次方,即1024,就是说像素的深度为10位,每个像素可以是1024种颜色中的一种。

例如:一幅画的尺寸是1024*768,深度为16,则它的数据量为1.5M。

计算如下:

1024*768*16bit(位)=(1024*768*16)/8Byte(字节)=[(1024*768*16)/8]/1024KB=1536KB={[(1024*768*16)/8]/1024}/1024MB=1.5MB。

2.7 频带(我都忘了哪里用到,搜一搜高斯那篇用到)

2.7.1 频带出处

频带,即带宽,指信号所占据的频带宽度;在被用来描述信道时,带宽是指能够有效通过该信道的信号的最大频带宽度。对于模拟信号而言,带宽又称为频宽,以赫兹(Hz)为单位。例如模拟语音电话的信号带宽为3400Hz,一个PAL-D电视频道的带宽为8MHz(含保护带宽)。对于数字信号而言,带宽是指单位时间内链路能够通过的数据量。例如ISDN的B信道带宽为64Kbps。由于数字信号的传输是通过模拟信号的调制完成的,为了与模拟带宽进行区分,数字信道的带宽一般直接用波特率或符号率来描述。

(简单说来说:带宽是指单位时间内链路能够通过的数据量。)

即:这条路同一时间只能过4个正常人。那么频带就是4个正常人。
小嗷理解错的话,请指点一下小嗷,谢谢大佬。

2.8 线性滤波源码分析 — boxFilter()

搜索 smooth.cpp(smooth中文意思:平滑) -> (ctrl + F)搜索 cv::boxFilter -> 一个cv::boxFilter的方法函数

2.8 线性滤波源码.PNG

如上图的CV _ INSTRUMENT _ REGION()和CV _ OCL _ RUN()以及CV _ OVX _ RUN小嗷不知道这三个函数是什么意思?全文搜索一下。没有它的函数,也就搜到API函数的运用。

那么一定是smooth.cpp导入库文件里面(java叫包)

2.8 线性滤波源码1.PNG

就导入3个hpp文件

CV _ OVX _ RUN和ovx _ defs.hpp有共同的单词哦(OVX)。于是,小嗷就打开ovx_defs.hpp

2.8 线性滤波源码2.PNG

OpenVX相关的定义和声明

OpenVX又是什么鬼?

OpenVX是计算机视觉应用跨平台加速的开放、免版税标准。它是由KHRONOS组设计的,以便于视觉算法的方法的便携式、优化和功率有效的处理。这是针对计算机视觉和相关场景中的嵌入式和实时程序。它使用连接的图形表示操作。

OpenVX指定了比计算机框架(如OpenCL)更高级的编程计算机视觉用例的抽象。高级别使得编程变得容易,并且底层执行在不同的计算架构上是高效的。这是在拥有一致的便携式视觉加速API的情况下完成的。

OpenVX基于可执行优选操作链的视觉节点的连接图。可以通过各种技术优化底层实现,例如:在各种处理单元或专用硬件上加速。这种架构有助于在不同的系统和不同的功率和性能,包括电池敏感,视觉启用,可穿戴显示器在OpenVX编程应用。

OpenVX是OpenCV开源库OpenCV的补充。OpenVX在一些应用中提供了比OpenCV更好的优化图形管理。

小嗷就想CV _ OVX _ RUN大概就是OpenVX中的函数,作用就是提供了比OpenCV更好的优化图形管理。

那么CV _ OCL _ RUN()我想是不是可以猜想成OpenCL中的函数?网上查一下如下:

OpenCL加速计算机视觉技术

  • OpenCV-CL 二进制下载
  • 初始化和信息
  • 单个元操作
  • 图像变换
  • 还原
  • 色彩转换
  • 丰富的滤波引擎,包括有各种类型的图像滤波器,如高质量图像增强
  • 基于均值漂移的变换,K-means,聚类(机器学习,估计深度时需要用到)
  • 角特征检测器
  • 模板匹配
  • 描述符匹配
  • 特征检测,Haar, 特征跟
  • 特征描述符
  • 加速的鲁棒特征(speeded-up robust features, SURF)
  • 梯度方向直方图(HOG)
  • 人脸识别 (Viola Jones)
  • 光流,如LK, TV L1, Farneback
  • 立体声对应:BM, BP, CSBP
  • 基于TV L1光流的超分辨率

OpenCV-CL是非常灵活的,可依照程序员的需要,尽可能多地或尽可能少地展现出OpenCL。即使具有很少或者根本没有OpenCL开发经验的程序员,也能简单地调用支持OpenCL功能的cv:: OCL模块,而无需了解或者编写一行OpenCL API或OpenCL内核代码。无论他使用的是APU中集成的GPU,还是独立显卡上的GPU,他的程序都能受益于GPU提供的优异的计算能力。事实上,你可以研究cv:: OCL模块中的OpenCL例子程序,去学习如何在计算机视觉应用问题中使用OpenCL。对于熟悉OpenCV并且具有丰富的开发经验的程序员,我们也给他们一个惊喜:他们可以利用OpenCV- CL的基础架构,获得免费的OpenCL支持轻松的使用OpenCL功能(仅仅只需要他们添加使用一行代码而已)。然后,程序员可将自己的内核程序插入OpenCV-CL框架,就可以扩展该框架,而无需重新做编译工作。 AMD特意在APP SDK2.8.1中引入这个互操作功能例子,就是为了说明这个过程是多么容易!

简单一句:这玩意是我们图像识别重点(不过,小嗷想想还是知道就行,撤撤)

CV _ INSTRUMENT _ REGION()估计也不是什么好鸟,有兴趣大家可以查查,查完发一份给小嗷,粘贴上本文(没错,小嗷怂了)。

小嗷沉思一阵,在这么说下去,估计要写几天几夜,直接上重点boxFilter()代码算了。

2.8 线性滤波源码3.PNG

2.8 线性滤波源码4.PNG

2.8 线性滤波源码5.PNG

2.8 线性滤波源码6.PNG

意想不到是居然涉及OpenCL和OpenVX,本来就是想说说源码。以后,可能需要改进优化算法什么,或者不用OpenCV这个库,就抄抄源码什么,变成自己的,哈哈哈,想不到有2个巨坑,真蛋疼。

源码中,还有UMat函数,具体可以看:

https://blog.csdn.net/jia20003/article/details/69802932

23总结与感想.png

  1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
  2. 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
  3. 写文章主要是为了后人少走点弯路,多交点朋友,一起学习
  4. 如果有好的图像识别群拉我进去QQ:631821577
  5. 就我一个白板,最后还是成的,你们别怕,慢慢来把

7.二维码

分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。

  • 邮箱:631821577@qq.com
  • QQ群:736854977
  • 有什么疑问公众号提问,下班或者周六日回答,ths

时间是公平的,人也就一辈子,大家有机会聚在一起学习分享也是一种缘分。而且,小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年。大家想想就知道,我代码和数学水平是多么渣渣。

像我这么渣,都能懂,难道你们这么优秀还不懂?当然,也有可能,我写不好误导各位造成的,所以,也希望大家勇于发言,给小嗷一个改正的机会。

推荐文件:

17.图像处理之线性滤波(线性运算/卷积) — OpenCV从零开始到图像(人脸 + 物体)识别系列

20.方差/标准差/数学期望/正态分布/高斯函数(数学篇)— OpenCV从零开始到图像(人脸 + 物体)识别系列

13.傅里叶变换(数学篇) — OpenCV从零开始到图像(人脸 + 物体)识别系列

1.人间词话(词话三境) — 人间词话篇

下篇估计就是中值和双边。

如果没有什么数学,就到腐蚀和膨胀。

小嗷是真不想写数学,无奈无力,高数本身就是在现实社会没什么用。


http://chatgpt.dhexx.cn/article/XGae88xx.shtml

相关文章

几种常用的假设图像边界条件用于抑制振铃效应及实现(下)

三 其他BC 1.Repeated BC Xu Zhou等人在《A boundary condition based deconvolution framework for image deblurring》提及,由于原文写的公式比较复杂不好理解,所以就不赘述了,其实核心就是外部边界区域内的某个像素点的灰度等于距离其最近…

振铃效应与样点自适应补偿(Sample Adaptive Offset,SAO)技术

SAO(Sample Adaptive Offset,自适应样点补偿)原理分析 这里写目录标题 SAO(Sample Adaptive Offset,自适应样点补偿)原理分析1. H265压缩原理2. SAO的作用3. SAO原理简介4. SAO的分类--BO5. SAO的分类--EO6…

几种常用的假设图像边界条件用于抑制振铃效应及实现(上)

一 介绍 传统的图像复原方法可能会给复原图像引入振铃效应,并且以边界振铃为主;产生这种现象的原因简单地来讲主要是由于模糊核的 不精确或者信息丢失。 [图片来自论文《光学合成孔径系统成像性能优化与分析》P79 魏小峰] Renting liu、Jiaya J…

rpm包的卸载

两个步骤: 1、查询 即查询Linux中安装的完整包名 命令【rpm -qa | grep xxx】 例如:rpm -qa | grep unzip 2、卸载 命令:rpm -e RPM包的完整名称 例如:rpm -e unzip-6.0-19.el7.x86_64 卸载之后检查发现已经不存在 - - -…

linux卸载命令6,小编为你叙述linux卸载命令【操作流程】

大家应该都知道我们在使用电脑的时候,会发现linux卸载命令【操作流程】的问题,如今还有很多用户不知道如何处理linux卸载命令【操作流程】的情况,于是我就给大家整理总结了linux卸载命令【操作流程】的具体处理方案,就是按照1&…

Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取

目录 1. 包名与包全名 2. RPM安装 3. RPM包升级 4. RPM包卸载 5. 查询是否安装RPM包 6. RPM包校验 7. RPM包中文件提取 1. 包名与包全名 包全名:操作的包是没有安装的软件包时,使用包全名,而且要注意路径包名:操作已经安…

linuxrpm命令卸载python_Linux RPM包安装、卸载、升级命令讲解

一个 RPM 包包含了已压缩的软件文件集以及该软件的内容信息,通常表现为以 .rpm 扩展名结尾的文件,例如 samba.rpm 。如果需要对RPM包进行操作则需要使用rpm命令。 一、RPM包的来源 所有RPM包都在系统光盘的Packages目录中,那么我们如何获取包…

rpm卸载包的命令

可以先用rpm -q xxx 或者 rpm -qf xxx/bin/xxxx.xx 来查询一下所属的rpm包的名字。然后用rpm -e xxxxxx 来删之。xxx/bin/xxxx.xx 是一个包中任意的文件xxxxxx 是查询得到的rpm包的名称 rpm -e的时候后面的文件名不用加版本号 安全地卸载 RPM卸载软件包,并不是简单地将原来安…

linux的rpm卸载,linux rpm卸载参数

linux rpm卸载参数 本站整理 发布时间:2009-03-10 15:38:48 作者:jb51.net 我要评论 rpm卸载参数--test : 卸载测试 --nodeps : 不检查依赖 --noscripts : 不执行脚本程序 --notriggers : 不执行触发程序 --justdb : 仅修改数据库 --force 强制 RPM卸载软件包,并不是…

rpm卸载命令

可以先用rpm -q xxx 或者 rpm -qf xxx/bin/xxxx.xx 来查询一下所属的rpm包的名字。 然后用rpm -e xxxxxx 来删之。 xxx/bin/xxxx.xx 是一个包中任意的文件 xxxxxx 是查询得到的rpm包的名称 rpm -e的时候后面的文件名不用加版本号 安全地卸载 RPM卸载软件包,并不是简单…

关于传递函数的双边线性Z变换+差分方程

下午查了一下午资料,翻看了一些书籍,看了一些视频学习!!!抛开这些,进入整体。 双边线性Z变换: 将S域虚轴和实轴改为Z域单位圆,由连续变为离散。 线性公式:(如…

基于深度学习的视频预测研究综述

原址:http://html.rhhz.net/tis/html/201707032.htm (收集材料ing,为论文做准备)[综述性文章,,,可以做背景资料] 莫凌飞, 蒋红亮, 李煊鹏 摘要:近年来,深度学习算法在众多有监…

【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质示例 | PCM 音频信号处理 | 使用 matlab 进行频移操作 )

文章目录 一、PCM 音频信号处理二、要点说明 一、PCM 音频信号处理 给定一段 PCM 音频数据 , 封装到 .WAV 文件 中 , 此时的信号 是 实信号 , 每个 PCM 音频采样都是一个 实数值 , 绘制该 音频数据 实信号 的 " 幅频特性 " , 将该 PCM 音频的 频率 移动 6 k H z 6…

Three.js视频教程

Threejs引擎 Threejs是WebGL多款3D引擎之一,threejs相比较babylonjs、cesiumjs等引擎在国内使用的更广泛,中文资料更多,相关招聘更多。所以对于WebGL工程师来说,学习threejs是很有必要的。 视频教程发布地址 案例欣赏 下面一些…

AV1视频编解码器核心编码工具概述

一、介绍 在过去的十年里,基于网络的视频应用变得非常普遍,现代设备和网络基础设施推动了高分辨率、高质量内容消费的快速增长。因此,占主导地位的带宽消费者,如视频点播(VoD)、实时流媒体和会话视频&…

Android平台上基于OpenGl渲染yuv视频

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 更多音视频开发文章,请看:音视频开发专栏 介绍一个自己刚出炉的音视频播放录制开源项目 前言 这是我音视频专栏的第一篇实例解析,也算是入门篇,重…

视频编码基本原理

原博客地址:https://blog.csdn.net/leixiaohua1020/article/details/28114081 视频编码基本原理 1.视频编码基本原理 (1) 视频信号的冗余信息 以记录数字视频的YUV分量格式为例,YUV分别代表亮度与两个色差信号。例如对于现有的…

从零开始傅里叶变换

1.前言 傅里叶变换是很多领域的基础工具&#xff0c;常用来做频域变换。但凭什么傅里叶变换可以转换至频域&#xff0c;又什么是频域。看门见山。 连续傅里叶变换公式: F ( w ) < f ( t ) , e i w t > ∫ − ∞ ∞ f ( t ) e − i w t d t (1.1) F(w) <f(t),…

小波变换(一)

小波变换(一) 由于项目可能会用到的原因,学一下,感觉已有的通俗易懂教程不够相应的学术性. 教程:《数字信号处理》陈后金著 视频教程:中国大学mooc-数字信号处理 文章目录 小波变换(一)傅里叶变换的局限性短时傅里叶变换(STFT)时间分辨率频谱分辨率我们到底想要什么东西 信号…

360视频:旋转球面投影RSP

旋转球面投影&#xff08;Rotated sphere projection&#xff0c;RSP&#xff09;将球体分为两个相同的部分&#xff0c;然后投影到平面上&#xff0c;宽高比3&#xff1a;2。 图1 RSP投影 球面上两部分的分割线类似于图2中网球上的分割线。 图2 网球分割示意图 Frame Packin…