【问题标题】:Sliding Gabor Filter in pythonpython中的滑动Gabor滤波器
【发布时间】:2014-08-12 03:40:30
【问题描述】:

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

brick 只是一个 numpy 数组。假设我有一个 5000*5000 的 numpy 数组。我想要实现的是生成两个新的 5000*5000 numpy 数组,其中像素是以它们为中心的 15*15 窗口的 gabor 滤波器的均值和 var 值。

谁能帮我实现这个目标?

编辑

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

【问题讨论】:

  • 您能否通过“gabor 过滤器的均值和 var 值...”来澄清一下您的意思?过滤器似乎是一个 31x31 像素的线性过滤器。你想得到这个下的滚动均值和平均值是(31x31)还是过滤图像的滚动均值和方差?

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


【解决方案1】:

如果你只是想计算滑动平均图像(卷积用方形内核全1),快速的方法是: P>

# 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个像素,所以你必须要照顾的边框效果自己。边缘大多数像素是坏的,无论如何,但它是由你来选择正确的边界填充,如果你需要一个。该算法以获得平均值(计算最少)的最快的方法,比@ 987654322尤其快得多@ P>

类似的诡计可以在计算方差,如果两个图像和它的平方进行平均,如以上所使用。那么

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

其中rolling_sum是滑动之和(即上述没有最后分割算法)。因此,只有两个滚动总和(图像及其平方)是必需的,以计算轧制方差。 P>

(警告:以上是未测试的代码,它的存在只是为了说明的想法) P>

【讨论】:

    【解决方案2】:

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

    在卷积每个像素是移位Gabor滤波器倍图像的像素的值的总和。也就是说,在卷积的每个像素是基本上在平均以恒定的归一化因子内,所以filtered基本上是您的平均值。 P>

    方差强>是比较困难的,因为这是所述平方之和,当然,需要在计算总和之前计算sqaures。但是,你可以通过预平方无论是图像和内核,那就是这样做很容易的: P>

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-27
      • 2018-12-11
      • 2011-07-04
      • 1970-01-01
      • 2023-03-19
      • 2014-07-14
      • 2019-02-03
      • 2012-02-14
      相关资源
      最近更新 更多