图像导数

图像强度的变化情况是非常重要的信息。强度变化可以用灰度图像的x和y方向导数 I_{x} 和 I_{y} 进行描述。对于彩色图像可以对每个通道分别计算导数。

图像的梯度向量为\bigtriangledown I=[I_{x},I_{y}]^{T},梯度有两个重要的属性;

1、梯度的大小

                                                                                  \left | \bigtriangledown I \right |=\sqrt{I_{x}^{2}+I_{y}^{2}}

2、梯度的角度

主要用于描述图像强度变化的强弱;描述了图像中在每个像素上强度变化最大的方向。

                                                                                \alpha =\arctan 2(I_{y},I_{x})

 图像导数可以通过卷积实现:

                                                                         I_{x}=I*D_{x}   和 I_{y}=I*D_{y}

 通常对于 D_{x} 和 D_{y} 选择 Prewitt 滤波器或者 Sobel 滤波器:

 

对于 Prewitt 滤波器: D_{x} = \begin{bmatrix} -1 & 0& 1\\ -1& 0& 1\\ -1& 0& 1 \end{bmatrix}     和   D_{y} = \begin{bmatrix} -1 &-1 &-1 \\ 0& 0 & 0\\ 1& 1& 1 \end{bmatrix}

对于 Gabor 滤波器:D_{x} = \begin{bmatrix} -1 & 0 & 1\\ -2& 0& 1\\ -1& 0& 1 \end{bmatrix}    和       D_{y} = \begin{bmatrix} -1 &-2 &-1 \\ 0 & 0&0 \\ 1 & 1 & 1 \end{bmatrix}

这些导数滤波器可以使用 scipy.ndimage.filters 模块的标准卷积操作来简单地实现:

from PIL import Image
from numpy import *
from scipy.ndimage import filters

im = array(Image.open('jianzhu.jpg').convert('L'))
gray()
#sobel滤波器
imx = zeros(im.shape)
#x方向导数
filters.sobel(im,1,imx)

imy = zeros(im.shape)
#y方向导数
filters.sobel(im,0,imy)

#梯度
magnitude = sqrt(imx**2 + imy**2)


#显示图像
figure()
gray()
subplot(1,4,1)
imshow(im)
title('im')
axis('off')
subplot(1,4,2)
imshow(imx)
title('imx')
axis('off')
subplot(1,4,3)
title('imy')
axis('off')
imshow(imy)
subplot(1,4,4)
imshow(magnitude)
title('magnitude')
axis('off')

图像导数_第1张图片

为了在图像噪声方面更加稳健,以及在任意尺度上计算导数,可以采用高斯导数滤波器:

                                                                          I_{x}=I*G_{\sigma x }   和   I_{y} = I*G_{\sigma y}   

其中,G_{\sigma x}  和   G_{\sigma y}  表示  G_{\sigma }  在 x  和  y 方向上的导数,G_{\sigma }  为标准差为 \sigma 的高斯函数;下面计算高斯导数。

sigma = 5 #标准差
imx = zeros(im.shape)
filters.gaussian_filter(im,(sigma,sigma),(0,1),imx)
imy = zeros(im.shape)
filters.gaussian_filter(im,(sigma,sigma),(1,0),imy)
subplot(1,2,1)
imshow(imx)
title('imx')
subplot(1,2,2)
imshow(imy)
title('imy')

图像导数_第2张图片

 

 

 

 

 

你可能感兴趣的:(python计算机视觉编程)