Numpy 用索贝尔滤波器进行边缘检测

索贝尔算子(Sobel operator,更多相关信息请见http://en.wikipedia.org/wiki/Sobel_operator)可被用来做图像的边缘检测。此类边缘检测就是对图像的亮度进行离散差分运算。因为图像是二维的,所以差分运算所得的梯度值也有两个分量。当然我们可以选择只计算某一个维度的梯度值。我们将对图像Lena应用索贝尔滤波器。

具体步骤

我们将以图像Lena为研究对象,学习怎样用索贝尔滤波器进行边缘检测。

  1. 在x轴方向应用索贝尔滤波器。

为了在x轴方向应用索贝尔滤波器,需要把参数axis设置为0。

sobelx = scipy.ndimage.sobel 
     (lena, axis=0, mode='constant')

  1. 在y轴方向应用索贝尔滤波器。

为了在y轴方向应用索贝尔滤波器,需要把参数axis设置为1。

sobely = scipy.ndimage.sobel 
      (lena, axis=1, mode='constant')

  1. 默认方式使用索贝尔滤波器。

默认方式使用索贝尔滤波器时,只需要提供一个数组:

default = scipy.ndimage.sobel(lena)

原始图像和处理后的图像如下图所示。该图展示了用索贝尔滤波器进行边缘检测的效果。

用索贝尔滤波器进行边缘检测

完整的边缘检测代码如下。

import scipy
import scipy.ndimage
import matplotlib.pyplot

lena = scipy.misc.lena()

matplotlib.pyplot.subplot(221)
matplotlib.pyplot.imshow(lena)
matplotlib.pyplot.title('Original')
matplotlib.pyplot.axis('off')

# 在x轴方向应用索贝尔滤波器
sobelx = scipy.ndimage.sobel(lena, axis=0, mode='constant')

matplotlib.pyplot.subplot(222)
matplotlib.pyplot.imshow(sobelx)
matplotlib.pyplot.title('Sobel X')
matplotlib.pyplot.axis('off')

# 在y轴方向应用索贝尔滤波器
sobely = scipy.ndimage.sobel(lena, axis=1, mode='constant')

matplotlib.pyplot.subplot(223)
matplotlib.pyplot.imshow(sobely)
matplotlib.pyplot.title('Sobel Y')
matplotlib.pyplot.axis('off')

# 默认方式使用索贝尔滤波器
default = scipy.ndimage.sobel(lena)

matplotlib.pyplot.subplot(224)
matplotlib.pyplot.imshow(default)
matplotlib.pyplot.title('Default Filter')
matplotlib.pyplot.axis('off')

matplotlib.pyplot.show()

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程