基本概念:
强度的变化可以用灰度图像 I(对于彩色图像,通常对每个颜色通道分别计算导数)的 x 和 y 方向导数 Ix 和 Iy 进行描述。
图像的梯度向量为∇I = [Ix, Iy]T。梯度有两个重要的属性,一是梯度的大小:
它描述了图像强度变化的强弱,一是梯度的角度:
α=arctan2(Iy, Ix)
描述了图像中在每个点(像素)上强度变化最大的方向。NumPy
中的 arctan2()
函数返回弧度表示的有符号角度,角度的变化区间为 -π...π。
我们可以用离散近似的方式来计算图像的导数。图像导数大多数可以通过卷积简单地实现:
Ix=I*Dx 和 Iy=I*Dy
对于 Dx 和 Dy,通常选择 Prewitt 滤波器:
和
或者 Sobel 滤波器:
和
代码:
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters
img = array(Image.open('2015.jpg').convert('L'))
figure()
gray()
subplot(2,4,1)
imshow(img)
title('yuantu')
axis('off')
sigma = 5
imgx = zeros(img.shape)
filters.sobel(img,1,imgx)
subplot(2,4,2)
imshow(imgx)
title('x')
axis('off')
imgy = zeros(img.shape)
filters.sobel(img,0,imgx)
subplot(2,4,3)
imshow(imgy)
title('y')
axis('off')
mgnitude = sqrt(imgx**2+imgy**2)
subplot(2,4,4)
imshow(mgnitude)
title('x**2,Y**2')
axis('off')
imgx1 = zeros(img.shape)
filters.gaussian_filter(img,(sigma,sigma),(0,1),imgx1)
subplot(2,4,5)
imshow(imgx1)
title('x_gauss')
axis('off')
imgy1 = zeros(img.shape)
filters.gaussian_filter(img,(sigma,sigma),(1,0),imgy1)
subplot(2,4,6)
imshow(imgy1)
title('y_gauss')
axis('off')
mgnitude1 = sqrt(imgx1**2+imgy1**2)
subplot(2,4,7)
imshow(mgnitude1)
title('x_gauss**2,Y_gauss**2')
axis('off')
show()
效果: