【干货】计算机视觉实战系列06——用Python做图像处理

【导读】专知成员Hui上一次为大家介绍主成分分析(PCA)、以及其在图像上的应用,这一次为大家详细讲解SciPy库的使用以及图像高斯模糊实战。

【干货】计算机视觉实战系列01——用Python做图像处理(基本的图像操作和处理)

【干货】计算机视觉实战系列02——用Python做图像处理(Matplotlib基本的图像操作和处理)

【干货】计算机视觉实战系列03——用Python做图像处理(Numpy基本操作和图像灰度变换)

【干货】计算机视觉实战系列04——用Python做图像处理(图像的缩放、均匀操作和直方图均衡化)

【干货】计算机视觉实战系列05——用Python做图像处理

SciPy库以及图像高斯模糊实战

SciPy



SciPy是建立在NumPy基础上,用于数值运算的开源工具包。SciPy提供很多高效的操作,可以实现数值积分、优化、统计、信号处理,以及对我们来说最重要的图像处理功能。接下来,本节会介绍SciPy中大量有用的模块。SciPy是一个开源工具包,可以从http://scipy.org/Download下载。

图像模糊



图像的高斯模糊是非常经典的图像卷积的例子。高斯模糊,听起来很高大上,其实就是一种很基础的数学算法应用,不要被“高斯”迷惑了双眼,它并没有高斯本人那么深不可测。高斯模糊是模糊图像的结果.它是一种广泛使用的图形软件的影响,通常会减少图像噪声和减少细节。这个模糊技术的视觉效果是一个平滑的模糊相似,查看图片通过一个半透明的屏幕,从明显不同散景在通常的照明的聚焦透镜或物体的阴影产生的影响。高斯平滑也被用来作为一个预处理阶段计算机视觉算法以提高图像在不同尺度的结构见尺度空间表示和尺度空间的实现。

在数学上,应用高斯模糊图像是一样的卷积一个图像高斯函数。这也被称为一个二维维尔斯特拉斯变换。相比之下,通过循环卷积\能更准确地再现散景功效自傅里叶变换一个高斯是另一个高斯,应用高斯模糊具有降低图像的高频成分的影响;高斯模糊是一个低通滤波器。

模糊的本质,实际上就是每一个图片中的像素取周边像素的均值.如下图所示:

在上图左边的方框中,我们首先定义一个中心点,即为“2”这个像素点。我们需要对中心点取值进行变换,变换规则为:中心处点的值取附近所有点值的平均值,由图中像素点可得:中心点的像素值就变成了1。在数值上,这种操作可以看成是一种平滑化的操作。那么对于变换后的二维图像来说,便可以看作是有了“模糊”的效果,中心点失去了自己本身的像素值,相当于细节丢失。而图像的模糊程度就完全取决于图像的模糊半径了。从值德角度来说,数值更加的趋向于平滑。

高斯模糊的核心就是取中心点周围所有像素点的均值作为自己的像素值,以此来达到平滑效果,在算法上,涉及到很多问题,从这些问题也是影响高斯模糊速度(模糊效率)的重要方面因素。

那么,影响高斯模糊的速度因素又有什么呢?根据我们分析,由于要对所有的点进行计算,所以高斯模糊是一个相对而言较为耗时的作用,而模糊所需的时间取决点也有很多,诸如算法,以及图片自身属性以及人的要求,机器性能都是影响到高斯模糊时间。

其中对高斯模糊的时间影响最大的是以下两个因素:(1)模糊半径;(2)像素点数量(图片大小)

高斯模糊的公式以及理解



高斯模糊之所以叫高斯模糊,是因为它运用了高斯的正态分布的密度函数。

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。

如下图所示:

公式为:

其中,μ是x的均值,σ是x的标准差(评论提醒)。由于每次计算都以当前计算点为原点,所以μ等于0。于是公式进一步简化为:

计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

N维高斯函数的通项公式:

里面的参数中,r就是模糊半径,而在二维坐标系中,模糊半径就是x^2+y^2,σ 是正态分布的标准偏差,所以代入通项公式我们就可以得到二维的高斯函数公式。 将N=2带入得到二维高斯函数的方程:

二维高斯函数公式生成的曲面的高线是从中心开始以正态分布辐向的同心圆.不为零的像素组成的矩阵(卷积)在原来的图像矩阵像素作做变换,每个像素的值都是相邻一圈的像素值的加权平均数.

图形表示如下图所示:

本质上,图像的模糊就是将(灰度)图像I和一个高斯核进行卷积操作:

其中“*”表示卷积操作;

是标准差为

的二维高斯核,定义为:

高斯模糊通常是其他图像处理操作的一部分,比如图像插值操作、兴趣点计算以及很多其他应用。

SciPy有用来做滤波操作的scipy.ndimage.filters模块。该模块使用快速一维分离的方式来计算卷积。

对于灰度图像,我们进行高斯模糊时采用如下代码:

from PIL import Image
import numpy as np
from scipy.ndimage import filters
from matplotlib import pyplot as plt

im = np.array(Image.open(u'test.jpg').convert('L'))
im2 = filters.gaussian_filter(im, 3)
im3 = filters.gaussian_filter(im, 5)

plt.subplot(1, 3, 1)
plt.axis('off')
plt.imshow(im, cmap='gray')
plt.title('original')

plt.subplot(1, 3, 2)
plt.axis('off')
plt.imshow(im2, cmap='gray')
plt.title('gaussian(kernel 3)')

plt.subplot(1, 3, 3)
plt.axis('off')
plt.imshow(im3, cmap='gray')
plt.title('gaussian(kernel 5)')

plt.show()

输出结果为:

对于彩色图像,我们进行高斯模糊时采用如下代码:

from PIL import Image
import numpy as np
from scipy.ndimage import filters
from matplotlib import pyplot as plt

im = np.array(Image.open(u'test.jpg'))
im2 = np.zeros(im.shape)
im3 = np.zeros(im.shape)
for i in range(3):
    im2[:, :, i] = filters.gaussian_filter(im[:, :, i], 3)
    im3[:, :, i] = filters.gaussian_filter(im[:, :, i], 5)
im2 = np.uint8(im2)  # color
im3 = np.uint8(im3)

fig = plt.figure(figsize=(15, 15))
plt.subplot(1, 3, 1)
plt.axis('off')
plt.imshow(im)
plt.title('original')

plt.subplot(1, 3, 2)
plt.axis('off')
plt.imshow(im2)
plt.title('gaussian(kernel 3)')

plt.subplot(1, 3, 3)
plt.axis('off')
plt.imshow(im3)
plt.title('gaussian(kernel 5)')

plt.show()

输出结果为:

上面gaussian_filters()函数的最后一个参数表示标准差。

图中显示了随着

的增加,一幅图像被模糊的程度。

越大,处理后的图像细节丢失越多。如果打算模糊一幅彩色图像,则不同于第一段模糊灰度图像的代码,只需要简单的对每一个颜色通道进行高斯模糊即可。

上面的脚本中,并不总是需要将图像转换成uint8格式,这里只是将像素值用八位来表示。

关于该模块更多的内容以及不同的参数选择,请查看http://docs.scipy.org/doc/scipy/reference/ndimage.html上SciPy文档中的scipy.ndimage部分。

参考文献:

python计算机视觉编程:http://yongyuan.name/pcvwithpython/

原文发布于微信公众号 - 专知(Quan_Zhuanzhi)

原文发表时间:2018-04-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

决策树原理与应用:C5.0

分类预测指通过向现有数据的学习,使模型具备对未来新数据的预测能力。对于分类预测有这样几个重要,一是此模型使用的方法是归纳和提炼,而不是演绎。非数据挖掘类的软件的...

4236
来自专栏机器之心

302页吴恩达Deeplearning.ai课程笔记,详记基础知识与作业代码

5028
来自专栏专知

【深度】Deep Visualization:可视化并理解CNN

【导读】本文利用非参数化方法来可视化CNN模型,希望帮助理解CNN。 专知公众号转载已获知乎作者余俊授权。 原文地址: https://zhuanlan.zhi...

7374
来自专栏计算机视觉战队

干货——图像分类(下)

在机器学习或者深度学习领域,参数和超参数是一个常见的问题,个人根据经验给出了一个很狭隘的区分这两种参数的方法。

812
来自专栏机器人网

机器学习算法分类与其优缺点分析

机器学习算法的分类是棘手的,有几种合理的分类,他们可以分为生成/识别,参数/非参数,监督/无监督等。 例如,Scikit-Learn的文档页面通过学习机制对算法...

2715
来自专栏marsggbo

DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week1深度学习的实用层面

更多笔记请火速前往 DeepLearning.ai学习笔记汇总 本周我们将学习如何配置训练/验证/测试集,如何分析方差&偏差,如何处理高偏差、高方差或者二者...

2435
来自专栏数据派THU

计算机视觉怎么给图像分类?KNN、SVM、BP神经网络、CNN、迁移学习供你选(附开源代码)

原文:Medium 作者:Shiyu Mou 来源:机器人圈 本文长度为4600字,建议阅读6分钟 本文为你介绍图像分类的5种技术,总结并归纳算法、实现方式,并...

66410
来自专栏机器之心

SIGIR 2018 | 大会最佳短论文:利用对抗学习的跨域正则化

近期学界有多个神经排序模型被提出,这些模型通过考虑原始查询-文档文本(query-document text)[14]、基于确切的查询词项匹配文档的模式 [5]...

702
来自专栏机器之心

从数学到实现,全面回顾高斯过程中的函数最优化

31910
来自专栏人工智能

主流机器学习算法简介与其优缺点分析

机器学习算法的分类是棘手的,有几种合理的分类,他们可以分为生成/识别,参数/非参数,监督/无监督等。

2.1K4

扫码关注云+社区