Python实现Gabor纹理特征提取

1. 什么是纹理特征?

纹理特征指的是在图像中存在的、重复出现的、具有一定规律的、描述图像局部结构的视觉模式。

在计算机视觉领域中,纹理特征在图像分类、目标检测、图像分割等任务中起着重要的作用。因为纹理特征可以提供有关图像的局部结构和纹理信息,有助于增强图像的鲁棒性和可区分性。

2. Gabor滤波器

Gabor滤波器是一种用于纹理特征提取的滤波器,它模拟了人眼对于不同方向和尺度的视觉特性。

Gabor滤波器是基于Gabor函数的滤波器,在频域中具有一定的方向选择性和尺度选择性。它通过在空间域中对图像进行滤波,可以提取出图像的局部纹理信息。

Gabor滤波器的数学表示如下:

import numpy as np

def gabor_filter(image, theta, sigma, frequency):
    """
    Apply Gabor filter to image.
    
    Args:
        image: Input image.
        theta: Orientation of Gabor filter.
        sigma: Standard deviation of Gabor filter.
        frequency: Frequency of Gabor filter.
    
    Returns:
        Filtered image.
    """
    height, width = image.shape
    x = np.arange(-width/2, width/2)
    y = np.arange(-height/2, height/2)
    xx, yy = np.meshgrid(x, y)
    x_theta = xx * np.cos(theta) + yy * np.sin(theta)
    y_theta = -xx * np.sin(theta) + yy * np.cos(theta)
    g = np.exp(-(x_theta ** 2 + y_theta ** 2) / (2 * sigma ** 2)) * np.cos(2 * np.pi * frequency * x_theta)
    filtered_image = np.fft.ifftshift(np.fft.ifft2(np.fft.fftshift(np.fft.fft2(image)) * np.fft.fftshift(np.fft.fft2(g)))))
    return np.abs(filtered_image)

在上述代码中,image表示输入图像,theta表示Gabor滤波器的方向,sigma表示Gabor滤波器的标准差,frequency表示Gabor滤波器的频率。

3. Gabor纹理特征提取

Gabor纹理特征提取是通过应用多个Gabor滤波器对图像进行滤波,然后提取滤波结果的统计特征来描述图像的纹理特征。

具体的步骤如下:

  1. 对输入图像进行灰度化处理。

  2. 对灰度图像应用多个Gabor滤波器,得到一组滤波结果。

  3. 对每个滤波结果,计算统计特征,如均值、方差、能量等。

  4. 将所有统计特征组合成一个特征向量作为图像的纹理特征。

下面是具体的Python代码示例:

import cv2
import numpy as np

def extract_gabor_features(image, orientations, frequencies, sigma):
    """
    Extract Gabor texture features from image.
    
    Args:
        image: Input image.
        orientations: List of orientations for Gabor filters.
        frequencies: List of frequencies for Gabor filters.
        sigma: Standard deviation of Gabor filters.
    
    Returns:
        Feature vector.
    """
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    feature_vector = []
    for theta in orientations:
        for frequency in frequencies:
            filtered_image = gabor_filter(gray_image, theta, sigma, frequency)
            feature_vector.append(filtered_image.mean())
            feature_vector.append(filtered_image.var())
            feature_vector.append((filtered_image ** 2).sum())
    return np.array(feature_vector)

image = cv2.imread("image.jpg")
orientations = [0, np.pi/4, np.pi/2, 3*np.pi/4]
frequencies = [0.1, 0.2, 0.3, 0.4]
sigma = 2
feature_vector = extract_gabor_features(image, orientations, frequencies, sigma)

在上述代码中,image表示输入图像,orientations