计算机视觉--图像导数-图像梯度向量

来源:互联网 发布:ucosiii软件定时器 编辑:程序博客网 时间:2024/05/02 00:51

基本概念:

强度的变化可以用灰度图像 I(对于彩色图像,通常对每个颜色通道分别计算导数)的 x 和 y 方向导数 Ix 和 Iy 进行描述。

图像的梯度向量为∇I = [IxIy]T。梯度有两个重要的属性,一是梯度的大小

\left|\boldsymbol{\nabla I}\right|=\sqrt{{\boldsymbol{I}_x}^2+{\boldsymbol{I}_y}^2}

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

α=arctan2(IyIx)

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

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

Ix=I*Dx 和 Iy=I*Dy

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

D_x=\begin{vmatrix}-1&0&1\\-1&0&1\\ -1&0&1\end{vmatrix} 和 D_y=\begin{vmatrix}-1&-1&-1\\0&0&0\\ 1&1&1\end{vmatrix}

或者 Sobel 滤波器:

D_x=\begin{vmatrix}-1&0&1\\-2&0&2\\ -1&0&1\end{vmatrix} 和 D_y=\begin{vmatrix}-1&-2&-1\\0&0&0\\ 1&2&1\end{vmatrix}

代码:

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()

效果:


0 0