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

0 投票
1 回答
680 浏览
提问于 2025-05-01 15:11

我正在尝试从输入图像中提取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)。我想知道这种情况是否很常见。这是否意味着我的图像中没有任何纹理?我不太确定该如何理解这个结果。

如果这个问题不太适合这个论坛,我表示歉意。我也在crossvalidated上发布了这个问题。

暂无标签

1 个回答

1

你只要看一下图片,就应该能大概知道它的纹理是什么样的。

我建议你去看看scikit-image文档中的示例。你可以看到一些典型的纹理图像结果,这样可以帮助你检查自己的代码。

我觉得你的代码里有个错误:在你的函数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是一个包含图像和卷积核的(均值,方差)表格)然后得到了这个:

0.00403515106897
1.67550281887
9.91940408151

撰写回答