【问题标题】:Gabor filters: large variance compared to the meanGabor 滤波器:与均值相比方差较大
【发布时间】:2014-11-05 05:58:14
【问题描述】:

我正在尝试从输入图像中提取 Gabor 特征。因此,我设置了一系列具有不同参数(频率、角度和标准偏差)的 Gabor 滤波器,并且我将这些滤波器中的每一个与输入图像进行卷积,并查看输出幅度图像的均值和方差。因此,在 python 中,它看起来像:

import numpy as np
from scipy import ndimage as nd

# Here kernel is a given Gabor filter
def filter_image(self, image):
    filtered = np.zeros((len(self.kernels)*2,) + image.shape)        
    for k, kernel in enumerate(self.kernels):            
        filtered[k*2, :] = nd.convolve(image, np.real(kernel), mode='wrap')
        filtered[k*2+1, :] = nd.convolve(image, np.imag(kernel), mode='wrap')

return filtered

现在,我将功率图像的均值和方差视为:

def compute_features(self, image):
    features = np.zeros((len(self.kernels), 2))
    filtered = filter_image(image)
    for k in range(0, len(self.kernels)):
        power_image = np.sqrt(filtered[k*2]**2 + filtered[k*2+1]**2)
        features[k, 0] = filtered[k, :].mean()
        features[k, 1] = filtered[k, :].var()

return features

因此,当我查看每个过滤器响应的均值和方差时,我注意到方差相对于均值非常高。例如,我得到的值是(平均值 = 0.83,方差 = 900)。我想知道这是不是经常看到的东西。这是否告诉我图像中没有任何纹理?我不知道如何解释。

如果这不完全属于这个论坛,我深表歉意。我也确实在交叉验证上发布了这个。

【问题讨论】:

    标签: python image-processing filtering


    【解决方案1】:

    您应该仅通过查看图像就对图像的纹理有所了解。

    我建议你看看example given in scikit-image documentation。您将能够看到纹理图像的典型结果并检查您的代码。

    我认为您的代码 sn-p 中有一个错误:在您的函数 filter_image 中,您正在迭代所有内核,而您应该只进行一次内核卷积。

    除此之外,您应该检查用作输入的图像类型。在 skimage 示例中,图像首先转换为浮动。然后这些特征都在 [0, 1] 中。从您的结果来看,我怀疑您正在使用整数,它可以产生非常不同的均值和方差值,尽管它在归一化后给出相同的输出。 如果我更改 skimage 示例中的代码并使用原始整数图像,我得到的结果更像你的而不是浮点数。我计算了均值与方差的最小/最大/均值比率:

    print((ref_feats[:, :, 0] / ref_feats[:, :, 1]).min())
    print((ref_feats[:, :, 0] / ref_feats[:, :, 1]).mean())
    print((ref_feats[:, :, 0] / ref_feats[:, :, 1]).max())
    

    (其中 ref_feats 是图像和内核上的 (mean, var) 表)并得到了这个:

    0.00403515106897
    1.67550281887
    9.91940408151
    

    【讨论】:

    • 感谢您的回复。我将研究整数/浮点问题,但无论如何都应该有隐式转换。但是,需要与每个内核进行卷积。这也在您引用的示例中完成(查看 compute_feats 函数)。这个想法是这些过滤器中的每一个都对某些特定的频率和方向敏感。
    • 认为你正在转换为浮动的东西!我刚刚检查了这个例子,它确实对价值观产生了巨大的影响。我想知道为什么将图像缩放到 0.0-1.0 会产生如此大的差异。
    • @Luca,我同意你必须与每个内核进行卷积,当然。但是你在你的两个函数中迭代所有内核,一定有问题(可能是复制粘贴问题——self.kernels 看起来不对)
    • @Luca,关于整数/浮点数,它不仅是强制转换,而且还标准化为 [0,1] 值。
    • 感谢您的回复。是的,在第二个循环中,这是一个复制/粘贴问题。接得好!是的,为什么归一化会影响均值和标准差?我认为它们的比率应该保持不变,还是我弄错了,它们也会按比例缩放?
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 2018-12-11
    • 2011-07-04
    • 1970-01-01
    • 2023-03-19
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多