索贝尔算子(Sobel operator,更多相关信息请见http://en.wikipedia.org/wiki/Sobel_operator)可被用来做图像的边缘检测。此类边缘检测就是对图像的亮度进行离散差分运算。因为图像是二维的,所以差分运算所得的梯度值也有两个分量。当然我们可以选择只计算某一个维度的梯度值。我们将对图像Lena应用索贝尔滤波器。
具体步骤
我们将以图像Lena为研究对象,学习怎样用索贝尔滤波器进行边缘检测。
- 在x轴方向应用索贝尔滤波器。
为了在x轴方向应用索贝尔滤波器,需要把参数axis
设置为0。
sobelx = scipy.ndimage.sobel
(lena, axis=0, mode='constant')
- 在y轴方向应用索贝尔滤波器。
为了在y轴方向应用索贝尔滤波器,需要把参数axis
设置为1。
sobely = scipy.ndimage.sobel
(lena, axis=1, mode='constant')
- 默认方式使用索贝尔滤波器。
默认方式使用索贝尔滤波器时,只需要提供一个数组:
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()