Gabor滤波器:与均值相比的大方差

时间:2014-11-04 18:47:51

标签: python image-processing filtering

我正在尝试从输入图像中提取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)。我想知道这是否是经常看到的东西。这是否告诉我图像中没有任何纹理?我不知道如何解释这个。

如果这不完全属于这个论坛,我会道歉。我确实在交叉验证时发布了这个。

1 个答案:

答案 0 :(得分:1)

只要看一下它就可以了解图像的纹理。

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

我认为您的代码片段中存在错误:在您的函数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