如何使用Gabor滤波进行特征提取?

2024-10-03 04:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组灰度图像(96,96),我想对整个图像逐像素应用gabor滤波器。我听说gabor滤波器在数据中提供最大方差,并且对方向和闪电不敏感。

这是我使用的一段代码。将滤波器应用于一幅图像,输出数据采用图像+Gabor滤波器。

我尝试将这种gabor滤波器应用到图像的机器学习算法中,在分类精度上没有改变和提高。为什么?

import cv2
import numpy as np
import pandas as pd
import pylab as pl

df = pd.read_csv('test.csv',header=0)

df['Image'] = df['Image'].apply(lambda im: np.fromstring(im, sep=' ') )
X = np.vstack (df['Image'].values) 

X = X.astype(np.uint8)
X = X.reshape(-1,96,96)


def image_histogram_equalization(image, number_bins=256):
    # from http://www.janeriksolem.net/2009/06/histogram-equalization-with-python-and.html

    # get image histogram
    image_histogram, bins = np.histogram(image.flatten(), number_bins, normed=True)
    cdf = image_histogram.cumsum() # cumulative distribution function
    cdf = 255 * cdf / cdf[-1] # normalize

    # use linear interpolation of cdf to find new pixel values
    image_equalized = np.interp(image.flatten(), bins[:-1], cdf)

    return image_equalized.reshape(image.shape), cdf

def build_filters():
 filters = []
 ksize = 31
 for theta in np.arange(0, np.pi, np.pi / 16):
  kern = cv2.getGaborKernel((ksize, ksize), 4.0, theta, 10.0, 0.5, 0, ktype=cv2.CV_32F)
  kern /= 1.5*kern.sum()
  filters.append(kern)
 return filters

def process(img, filters):
 accum = np.zeros_like(img)
 for kern in filters:
  fimg = cv2.filter2D(img, cv2.CV_8UC3, kern)
  np.maximum(accum, fimg, accum)
 return accum

filters = []

for k in xrange(5):
 img = X[k]

 X[k, :, :] = image_histogram_equalization(X[k, :,:])[0]

 filters = build_filters()
 filters = np.asarray(filters)
 print filters.shape
 res1 = process(img, filters)
 cv2.imshow('result', res1)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

f = np.asarray(filters)
print 'Filters', f.shape

它输出16个方向的滤波器(对于一个特定频率)

(16, 31, 31) - Image 1
(16, 31, 31) - Image 2
(16, 31, 31) - Image 3
..

Gabor filter applied on grayscale face

抱歉,我的问题可能为时过早,但我很想知道更多。

  1. 我应该给机器学习分类器提供什么?它只是gabor滤波器数据还是滤波器本身应用于所有图像。
  2. 如何调整上述代码以获得10个不同频率的滤波器响应?我想为每个图像提取16x10=160个过滤器。
  3. 对于96x96像素的图像,我将gabor核大小设置为31x31。这是对的吗?

Tags: 图像imageimportdfimgnpgaborcv2