学习
实践
活动
专区
工具
TVP
写文章

用Python做图像处理:图像导数实战

导读:数量庞大的图像和视频充斥着我们的生活。我们需要对图片进行检索、分类等操作时,利用人工手段显然是不现实的。于是,计算机视觉相关技术便应运而生,并且得到了快速的发展。本文以时下最流行的Python语言为工具,对图像处理技术的具体操作进行详细讲述,旨在让零基础的读者也可以轻松上手!

01 SciPy

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

02 图像导数

在整个图像处理的学习过程中可以看到,在很多应用中图像强度的变化情况是非常重要的信息。强度的变化可以用灰度图像I(对于彩色图像,通常对每个颜色通道分别计算导数)的x和y的方向导数和进行描述。

图像的梯度向量为:

梯度有两个重要的属性,一个是梯度的大小:

它描述了图像变化的强弱,一是梯度的角度:

它描述了图像中在每个点(像素)上强度变化最大的方向。NumPy中的arctan2()函数返回弧度表示的有符号角度,角度的变化区间为

我们可以用离散近似的方式来计算图像的导数。图像的导数大多可以通过卷积简单地实现:

对于和,通常选择Prewitt滤波器:

Prewitt边缘算子是一种边缘样板算子,利用像素点上下,左右邻点灰度差,在边缘处达到极值检测边缘,对噪声具有平滑作用。由于边缘点像素的灰度值与其领域点像素的灰度值有显著不同,在实际应用中通常采用微分算子和模板配匹方法检测图像的边缘。

或者使用Sobel滤波器,Sobel算法是一种较成熟的微分边缘检测算法,它计算简单,且能产生较好的检测效果,对噪声具有平滑作用,可以提供较为精确的边缘方向信息。

Sobel算子是一阶导数的边缘检测算子,使用两个方向算子(垂直算子和水平算子),对图像进行卷积运算,得到两个矩阵,再求这两个矩阵对应位置的两个数的均方根,得到一个新的矩阵,即为灰度图像矩阵中各个像素点的梯度值。在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。

其实图像的梯度可以用一阶导数和二阶偏导数来求解。但是图像以矩阵的形式存储的,不能像数学理论中对直线或者曲线求导一样,对一幅图像的求导相当于对一个平面、曲面求导。对图像的操作,我们采用模板对原图像进行卷积运算,从而达到我们想要的效果。而获取一幅图像的梯度就转化为:模板(Roberts、Prewitt、Sobel、Lapacian算子)对原图像进行卷积,不过这里的模板并不是随便设计的,而是根据数学中求导理论推导出来的。

代码为:

输出结果为:

▲上述输出结果分别是原始灰度图像、x导数图像、y导数图像、梯度大小图像

这种计算图像导数的方法有一些缺陷,在该方法中,滤波器的尺度需要随着图像分辨率的变化而变化。为了在图像噪声方面更稳健,以及在任意尺度上计算导数,我们使用高斯导数滤波器:

其中和表示在x和y方向上的导数,为标准差为σ的高斯函数。

我们之前用于模糊的filters.gaussian_filter()函数可以接受额外的参数,用来计算高斯导数。可以简单的按照下面的方式来处理:

输出结果为:

(a)

(b)

上面输出结果(a)、(b)中图片依次为:原始灰度图像,x导数图像,y导数图像,而(a),(b)的区别为设置不同的标准差之后的高斯滤波处理图像。

作者:Hui

参考文献:

python计算机视觉编程:

http://yongyuan.name/pcvwithpython/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180501B194D900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券