一起学opencv-python九(性能的测量和优化与图像处理的数学原理)

版权声明: https://blog.csdn.net/qq_41740705/article/details/82812640

图像混合

其实用的就是cv2.addWeighted函数,前面也介绍过这个函数。不过首先得把图片的形状搞成一样的,这个画图可以做到。

 

接下来是一块比较重要的内容。

性能的测量和优化

参考

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_optimization/py_optimization.html

首先是opencv中计算事件的函数,cv2.getTickCountcv2.getTickFrequency,这两个函数要结合起来用。

 

当然time模块或者timeit模块也可以,timeit模块更精细,这个我们在python学习那里已经掌握了,忘记的去考古即可。

 

用的不是同一个图片,可以看到整个程序一共4.7s,有4.48s都花费在中值滤波上了。

 

 

 

这个是因为没有在ipython环境下。

 

可能是安装anaconda的时候配置过了环境变量吧,直接输入ipython就可以进入了。

 

关于ipython,推荐https://blog.csdn.net/ztf312/article/details/78677093和

https://blog.csdn.net/qq_31095335/article/details/52179599

ipython的tab补全确实是不错的哦。

 

 

 

有性能优化的时候每依次大概需要469,没有则需要476,这个差距不是太大。

 

看起来x*x和x**2的差距就比较大了。

 

视图和副本前面我们介绍过。

 

 

 

副本,视图和深拷贝的差距一目了然。

 

图像处理的数学原理

参考了https://www.cnblogs.com/bithuaning/p/6924978.html

http://www.cnblogs.com/wuyuankun/p/4149499.html和

https://blog.csdn.net/chaipp0607/article/details/72236892?locationNum=9&fps=1

有一个很重要的概念叫做卷积。

 

上面的式子表示的是一个离散卷积,因为是数字信号,这里的卷积其实是一个加权和。推荐到https://www.zhihu.com/question/22298352?rf=21686447去看一看。数学定义中的卷积是有连续的,那么求和号∑就变成了积分号,其实莱布尼兹设计积分号的时候就是把∑拉长。

 

其实也是加权叠加嘛。

 

我更习惯说是饱和而不是截断。卷积核的和为1,暂时想不出来比较好的证明方法。

 

 

 

 

 

 

 

 

 

平滑之后边界看起来比较模糊了。

 

 

 

 

 

 

 

 

 

 

 

 

 

关于边缘检测的原理:参考https://www.jianshu.com/p/2334bee37de5

里面太基础的数学我就不在这里重复了,我这里截图过来的都是我觉得需要一定解释的。

 

这里没有把从G(x,y)到最后的图像的过程说清楚,参考https://blog.csdn.net/chaipp0607/article/details/54348624

 

 

 

也就是由G(x,y)到最后的图其实还有一个二值化或者说阈值化的过程,当计算出来的Gx或者Gy大于一定值的时候我们才认为这个像素点是一个边界。

 

 

 

上面的差分都是用的后向差分,目的是为了让以x,y为中心包含的九宫格的元素包含进来。最后肯定是还要对这个结果进行一下阈值化。上面还是没有对数学很深入,我觉得我需要深入一下,参考了https://blog.csdn.net/u014485485/article/details/78364573

 

这个最后的结果是中间是-4的那个,那么-8的那个是怎么来的呢?其实用的是全微分而不是偏微分,下面我来演示一下过程,一阶差分用的是后向差分,也就是f(x,y)-f(x-1,y),而二阶差分用的是前向差分,也就是fx(x+1,y)-fx(x,y),目的还是为了包含的元素都在以x,y为中心的九宫格里面。

 

最后化简出来就是中心为-8的那个。中间是-20的那个是把fxx和fyy前的系数变成2的结果,但是不知道为什么做,可能是要突出这两项二阶偏导吧。

两个缺点:

1.没有了边缘的方向信息;          

 2.双倍加强了噪声的影响

 

 

 

 

 

还有一些高斯和拉普拉斯的结合版:https://blog.csdn.net/u014485485/article/details/78364573

 

关于高斯模糊的原理:请参考http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

我就不截图过来了。

想要再深入了解高斯模糊数学原理的:https://www.cnblogs.com/evennl/p/3894438.html

简单的说就是高斯分布函数的傅里叶变换还是均值为0的高斯分布函数,所以是低通滤波。但是数学是需要严谨的推导的,推导过程就在上面。

 

 

 

 

 

关于协相关和卷积:

 

 

 

   对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积或者协相关。卷积和协相关的差别是,卷积需要先对滤波矩阵进行180的翻转,但如果矩阵是对称的,那么两者就没有什么差别了,上面算子由好多都是对称的。

还有https://www.cnblogs.com/xiaojianliu/p/9076547.html也提到了区别,都说的是一件事,卷积需要倒180再乘,其实就是为了凑卷积的形式:

 

为什么要凑卷积的形式呢,我们接着往下看。我们再来看一看其它人描述卷积核的角度:

 

红线部分已经大概说了锐化的原理,边缘的亮度和其它地方会差别比较大,简单理解一下,如果其它地方比边缘的亮度要高,那么用锐化核进行卷积操作以后,边缘的亮度就比周围的亮度更低了,就提高了对比度。嗯,我们还知道了增加卷积核的半径可以增强锐化效果。

 

 

 

 

 

 

 

 

 

 

 

卷积的计算

 

什么是可分离卷积呢?参考https://www.cnblogs.com/cvtoEyes/p/8848815.html

 

快速计算卷积:

 

这就理解了为什么要把卷积核倒180来凑卷积的形式了吧,因为只有符合卷积的形式才满足卷积定理,才能快速计算卷积。

 

 

 

这一讲的数学只是函数蛮多的。

展开阅读全文

没有更多推荐了,返回首页