首页 > 数码 > 21.失真/低高通/振铃效应/旁瓣泄漏效应/频域滤波/图像深度/频带/线性滤波源码分析(数学篇) - OpenCV从零开始到图像

21.失真/低高通/振铃效应/旁瓣泄漏效应/频域滤波/图像深度/频带/线性滤波源码分析(数学篇) - OpenCV从零开始到图像


本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

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



那是你和我的倾城时光。

虽然坎坷,虽然彷徨,

可只因有幸遇到唯一一个你,

 与财富无关,

与一切地位、名声、权力,

没有半点瓜葛。

装逼结束。补补上上篇的数学

哎,真蛋疼,去他妈的!


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

  1. 失真

  2. 低高通(和高低频什么关系?)

  3. 振铃效应

  4. 频域滤波

  5. 旁瓣效应

  6. 图像深度

  7. 频带

  8. 线性滤波源码分析


2.1 失真

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

2.2 低高通

简单来说:

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

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

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

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函数的形状,,而外层的其他突起则导致理想低通滤波器会产生振铃效应。

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

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

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

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

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

详情网址:

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。

计算如下:

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

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

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

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

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

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

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

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

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

就导入3个hpp文件

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

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()代码算了。

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

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

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

  1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)

  2. 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年

  3. 写文章主要是为了后人少走点弯路,多交点朋友,一起学习

  4. 如果有好的图像识别群拉我进去QQ:631821577

  5. 就我一个白板,最后还是成的,你们别怕,慢慢来把

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

  • 邮箱:631821577@qq.com

  • QQ群:736854977

  • 有什么疑问公众号提问,下班或者周六日回答,ths

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

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

推荐文件:

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

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

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

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

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

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

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


友情链接