关于图像模糊算法的实现,git
我相信大多数学习图像算法的朋友都很熟悉。github
例如常见的毛玻璃效果,高斯模糊等等。算法
而图像模糊最简单的实现就是 在必定区域 对像素作平均值计算。网络
术语描述,卷积。学习
1.认识卷积优化
而平均值计算能够,看作是一种常见的卷积计算,卷积核权重都为1。ui
OpenCV中与之对应的算法是BoxBlur。设计
图像方面深度学习中最重要的两个层,一个池化层,一个卷积层,3d
其中池化层能够认为是一种特例的卷积层,与求平均值相似。blog
从网上找了一张卷积操做的示例图片。
这样看,虽然知道是在作一个点面计算的操做,可是要具体描述卷积的用途或者原理,是有点困难的。
在两年前一次公司的内部技术分享会上,我是这么定义卷积的。
卷积计算从形象上来描述,在图像领域,通常是2维,
因此能够这么说 “计算两个物体在n维空间的类似度(叠加度)的操做,就称之为(n维)卷积。”
因此图像是计算两个物体在2维空间的类似度(叠加度)的操做,就称之为卷积。
若是两个物体彻底一致,卷积彻底重合,重合度为1,这时能够认为它就是同一个物体。
以上描述的两个物体,在算法中通常 指的是 卷积核 和被卷积图片,卷积结果就是其二者的重合度。
看下深度学习中的池化层。
根据上面的描述,从新理解一下,这个层的做用。
这里就不展开细讲了,大概你们能理解一下卷积这个操做便可。
而通常状况下,卷积操做,是一种信息外散或内聚的计算,
固然也有卷积,反卷积,转置卷积的说法。
举个例子,例如均值池化或者说均值卷积,均值模糊。
从计算来看,是取目标像素临近区域像素的平均值,而全部临近像素的权重都为1.
最终目标像素的值为n分之1.
那么这个计算就好像是把一个物品在2维空间直接摊平,还不能理解的再看下上面对卷积的描述。
就像你有9只蚂蚁,你但愿他们长得同样大,你一巴掌下去,身体所有压平。
而在图像领域,绝大多数的模糊,就是受到一个“物体”或者说“卷积核”的干扰,
导致采集到的信息丢失,或者说不许确。
例如在按下快门的一瞬间,你手抖了,或者说失去焦点,
就会很容易形成呈像模糊。
2.图像修复
假设咱们能找到致使成像模糊的缘由,是否是就能实现修复模糊图像呢?
答案是确定的。
不过取决于最终采集到的信息的完整度。
若是最后成像一片漆黑,那这个时候是无能为力的。
由于已经没有足够的信息了。
而通常图像是由色光三原色组成,红绿蓝。
理论上只要其中一种颜色信息完整,就能够用于辅助修复其余色光。
只要能计算到当时的色光分布状况便可实现。
这里咱们就须要稍微说起一下摄像领域3大算法,自动白平衡,自动对焦,自动曝光。
简单讲下 这三个算法的区别。
白平衡是为了解决色光分布不均,信息缺失或失真问题的。
自动对焦是为了成像清晰,人为干扰辅助最终成像。
自动曝光固然是为了解决采光问题,弥补感光元件的不足。
大概的前后顺序,理论上应该是 对焦->曝光->白平衡
通常而言,从这逻辑来看,白平衡是最难解决的,由于它受到前面两个因素的干扰。
可是实际上,白平衡和曝光目前都解决得很好。
HDR严格意义上来讲,能兼顾白平衡和曝光。
可是对焦或者说失焦,抖动的问题,一直以来都是老大难。
缘由也很简单,致使成像模糊的因素有不少,经过什么样的方法来有效评估修复,就显得比较困难。
假设能知道计算到当时受到什么“物体”的干扰,经过卷积的方式,移除这干扰,是否是就能修复模糊,恢复图片呈像。
假设形成模糊的因素为: 清晰的图片 + 干扰因素 = 最终成像
那么反之恢复图像即为: 最终成像 - 干扰因素 = 清晰图片
而这里把干扰因素和清晰的图片都认为是一种卷积“物体”。
3.去模糊
有了前面的基础知识,咱们能够作一个假设,进行验证。
例如,我先对一张图片作卷积操做,模拟模糊成像。
这个时候: 你同时有了 清晰的图片 + 干扰因素 = 最终成像
验证一下: 最终成像 - 干扰因素 = 清晰图片
这里不展开算法实现,
可是结果我能够告诉你们,这思路没错,可是有一个干扰因素错了。
它就是卷积核的大小。
卷积核大小直接决定它的做用范围。
而咱们第一步拿到的 清晰的图片 + 干扰因素 = 最终成像
这里 最终成像-干扰因素 却绝对不等于清晰的图片。
由于 这里的干扰因素和最终成像 二者之间并非简单的线性关系,相加或者相减,
他们的关系是卷积关系,也就是说他们都受到卷积核的影响。
若是想要达到 最终成像 - 干扰因素 = 清晰图片
必须 在最终成像的时候用相似卷积的方式,消除卷积核的内容以及范围的影响。
换句话说,这个操做必须控制好变量。
这个问题说真的,我思考了好久好久。
最后终于知道问题在哪里,就是图像的明度,也就是最终成像。
也就是最终成像中是含有卷积核权重信息的,若是要消除这个信息,
必须将成像也做为权重参与计算。
也就是说,形成模糊的状况应该是:
if( sqrt(nx-x) + sqrt(ny-y) < sqrt(radius) ) { w = luminance(rgb) sum += w*rgb; wsum += w; } sum /= wsum;
伪代码,简洁形象地表达这个现象。
知道这个来龙去脉,如今恢复模糊,该如何计算。
这个留个做业给你们。
上面伪代码我称之为 散焦 算法,反之为 聚焦 也就是去模糊 。
聚焦算法最终能够实现耗时模糊半径无关,它是去模糊的一种特例。
目前,此算法暂无开源计划。
好几年前就有去模糊的商业软件,固然早期版本做者也开源了。
项目地址:https://github.com/Y-Vladimir/SmartDeblur
可是这个项目并无很好准确计算到去模糊卷积核。
前几天ipol.im公布了一个比较优秀的评估去模糊卷积核的算法。
从官网demo演示来看,效果特别不错。
可是,它和SmartDeblur 都有着同样的问题,就是用到傅里叶变换去作卷积操做,
十分耗时。
都采用了fftw,计算量仍是居高不下。
我对它提供的代码,作了一些简单的裁剪,cmake编译经过,仅依赖fftw。
而代码的算法调优等等,还没作,算法优化空间比较大,最近精力有限,
在音频算法上花的时间比较多,图像暂时没有精力作起来。
感兴趣的朋友,能够移步项目:
https://github.com/cpuimage/Deblurring
而近些年,深度学习大兴,各类各样的模型以及训练集,五花八门。
固然也有去模糊的实现。
效果很是惊艳!
网络结构以下:
对于采用深度学习的方法进行去模糊实现,能够参阅文章:
https://blog.sicara.com/keras-generative-adversarial-networks-image-deblurring-45e3ab6977b5
项目地址:
https://github.com/RaphaelMeudec/deblur-gan
相关论文:
DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks
https://arxiv.org/pdf/1711.07064.pdf
最后作一个简单的总结,在图像领域,使用卷积就能很是好解决 图像的空间问题,
而深度学习训练获得的权重,能够简单的类比上面提到的干扰因素。
经过大量的数据,训练提取 可能性的干扰因素(物体),如果当前图像也有符合这个特征的因素(物体),
则进行相应的操做计算。
定位特征,确认特征,发现并处理特征。
分别 对应物体检测,物体识别,风格化或其余加强修复处理。
采用深度学习最大的好处就是能预先训练获得已知的信息,而后进行对应的处理。
而传统算法,则须要采用先验条件,
而后在一张图片中去发现可能性因素,因为参数较少,鲁棒性通常不佳。
相比而言,传统算法困难重重,由于你要经过科学方式找到一种适配数据天然规律的先验,真的太不容易。
而深度学习是另外一个问题,数据依赖,数据干扰,数据处理,这些预处理也着实够人头大的了,
而后还要设计一个比较有效且优良的神经网络。
就目前来看,经典传统算法稳定性比较高,可是泛化能力通常较差。
深度学习目前还须要很多传统算法配合进行训练处理,以求达到更好的效果。
就目前来看,工业化落地也有很多问题,不过相信很快就能作得很好了。
由于有大公司和大量资金资本的助推,应该不是难事。
如有其余相关问题或者需求也能够邮件联系俺探讨。
邮箱地址是: gaozhihan@vip.qq.com