在python中滑动Gabor过滤器

时间:2014-06-21 15:43:32

标签: python image-processing numpy scipy signal-processing

从skimage计算gabor过滤器的gabor过滤器示例中获取图像非常简单:

import numpy as np

from scipy import ndimage as nd

from skimage import data
from skimage.util import img_as_float
from skimage.filter import gabor_kernel

brick = img_as_float(data.load('brick.png'))

kernel = np.real(gabor_kernel(0.15, theta = 0.5 * np.pi,sigma_x=5, sigma_y=5))

filtered = nd.convolve(brick, kernel, mode='reflect')

mean = filtered.mean()
variance = filtered.var()
砖块只是一个numpy数组。假设我有一个5000 * 5000的numpy数组。我想要实现的是生成两个新的5000 * 5000 numpy数组,其中像素是以15 * 15窗口为中心的gabor过滤器的平均值和var值。

有人可以帮助我实现这个目标吗?

修改

¿我为什么被投票?无论如何,为了澄清我展示了如何在单个图像上计算gabor滤镜的示例。我想简单地在非常大的图像的小方块子集上计算一个gabor滤波器(因此是滑动窗口)。

2 个答案:

答案 0 :(得分:2)

没有标准方法可以做到这一点(我知道),但你可以直接自己做。

卷积中的每个像素是移位gabor滤波器的值乘以图像像素的总和。也就是说,卷积中的每个像素基本上都是均值到恒定的归一化因子内,所以filtered基本上就是你的意思。

方差有点困难,因为它是平方的总和,当然,您需要在计算总和之前计算平方。但是,你可以通过预先平方图像和内核来实现这一点,即:

N = kernel.shape[0]*kernel.shape[1]
mean = nd.convolve(brick, kernel, mode='reflect')/N
var = nd.convolve(brick*brick, kernel*kernel, mode='reflect')/N - mean*mean

答案 1 :(得分:2)

如果您只是想计算图像的滑动平均值(使用方形内核和所有1'的卷积),快速方法是:

# fsize is the filter size in pixels
# integrate in the X direction
r_sum = numpy.sum(img[:, :fsize], axis=1)
r_diff =  img[:, fsize:] - img[:, :-fsize]
r_int = numpy.cumsum(numpy.hstack((r_sum.reshape(-1,1), r_diff)), axis=1)

# integrate in the Y direction
c_sum = numpy.sum(r_img[:fsize, :], axis=0)
c_diff = r_img[fsize:, :] - r_img[:-fsize, :]
c_int = numpy.cumsum(numpy.vstack((c_sum, c_diff)), axis=0)

# now we have an array of sums, average can be obtained by division
avg_img = c_int / (f_size * f_size)

此方法返回的图像在两个方向上都缩小了1个像素,因此您必须自己处理边框效果。无论如何,边缘大多数像素都是坏的,但如果需要,可以选择正确的边框填充。该算法是获得均值(最少计算)的最快方法,尤其比numpy.convolve快得多。

如果图像及其平方均如上所述平均,则可以使用类似的技巧来计算方差。然后

npts = fsize * fsize
variance = (rolling_sum(img**2) - rolling_sum(img)/npts) / npts

其中rolling_sum是滑动总和(即上面的算法没有最后一个除法)。因此,只需要两个滚动总和(图像及其平方)来计算滚动方差。

(警告:上面的代码未经测试,只是为了说明这个想法。)