(8-3)图像特征提取:纹理特征
8.3 纹理特征
纹理特征作为一种图像特征提取技术,在这一领域具有重要的应用价值。其核心关注点在于图像中的纹理模式及其结构信息,并通过分析这些特征信息来揭示图像的深层属性与本质联系。这些纹理相关的信息能够帮助我们在多个应用场景中实现更为精准的识别与分析功能。
具体而言,在Python编程环境中,
我们可以借助相关的Python库模块和技术手段完成这些方法的具体应用。
其中,
常见的提取手段包括灰度共生矩阵等基础算法,
以及基于方向梯度分布的统计模型等复杂方法。
在实际操作过程中,
这些算法通常会根据具体的需求设定不同的参数配置,
并结合特定的数据预处理步骤来优化最终的结果质量。
为了确保算法的有效运行,
通常需要遵循严格的流程规范:
首先对输入数据进行标准化处理,
然后按照设定好的步骤序列逐步执行计算过程,
最后再通过结果验证与参数优化来提升整体性能水平。
8.3.1 灰度共生矩阵
Gray-Level Co-occurrence Matrix(GLCM)是一种广泛应用于图像分析领域的纹理特征提取方法。它则用于描述并量化图像中不同区域或元素间的相互作用与空间分布情况。该方法通过构建基于相邻像素对的空间分布模型来表征 textures 的特性,并可从这些模型中提取丰富的 texture 信息。具体而言,在GLCM的基础上可以通过计算相关统计指标如对比度、能量、熵等来定量分析 texture 的细节特性。这种基于统计特性的分析手段使得GLCM成为一种高效且实用的空间纹理特征提取工具。
下面是使用灰度共生矩阵方法实现图像纹理特征提取的步骤:
- 为了将彩色图像转换为gray-scale image:由于gray-scale matrix method基于gray-scale images, 所以首先要进行color-to-gray conversion.
- 定义gray-scale co-occurrence matrix涉及三个因素: gray-level数量, distance以及direction. gray-level数量表示将亮度分为若干等级; distance指相邻点之间的间距; direction指相邻点的方向.
- 为了计算gray-scale co-occurrence matrix, 遍历整个image中的每个pixel point. 对于每个pixel point, 计算其与相邻pixel point的亮度关系, 并记录出现频率后更新matrix.
例如下面是一个使用灰度共生矩阵方法提取纹理特征的实例代码。
实例8-4:使用灰度共生矩阵方法提取纹理特征
源码路径:daima*8*huigong.py**
import cv2
from skimage.feature import greycomatrix, greycoprops
def calculate_glcm(image, distances, angles):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
glcm = greycomatrix(gray_image, distances, angles, levels=256, symmetric=True, normed=True)
return glcm
def extract_texture_features(glcm):
contrast = greycoprops(glcm, 'contrast')
energy = greycoprops(glcm, 'energy')
correlation = greycoprops(glcm, 'correlation')
homogeneity = greycoprops(glcm, 'homogeneity')
return contrast, energy, correlation, homogeneity
# 读取图像
image = cv2.imread('image.jpg')
# 计算灰度共生矩阵
distances = [1] # 距离
angles = [0] # 方向
glcm = calculate_glcm(image, distances, angles)
# 提取纹理特征
contrast, energy, correlation, homogeneity = extract_texture_features(glcm)
# 打印纹理特征
print('Contrast:', contrast)
print('Energy:', energy)
print('Correlation:', correlation)
print('Homogeneity:', homogeneity)
代码解读
在上述代码中首先读取图像随后调用calculate_glcm函数来计算图像的灰度共生矩阵接着调用extract_texture_features函数提取包括对比度能量相关性和均匀性在内的多种纹理特征例如计算出对比度为contrast能量为energy相关性为correlation以及均匀性为homogeneity执行后会输出:
Contrast: [[427.90448161]]
Energy: [[0.05509271]]
Correlation: [[0.85237939]]
Homogeneity: [[0.47605069]]
代码解读
8.3.2 方向梯度直方图
方向梯度直方图(Histogram of Oriented Gradients, HOG)是一种依据梯度信息进行纹理特征提取的方法。该技术通过分析图像中每个像素点的方向信息及其强度,并将其划分为多个小区域,在统计每个区域内不同方向上的像素分布情况后生成一个频率分布图来反映图像的空间纹理特性。具体实施过程中包含以下几个关键步骤:首先对每个像素计算其所在位置的方向向量;其次根据这些方向向量生成直方图;最后将各区域的数据整合起来得到完整的HOG特征向量描述
- 生成灰度图像是为了提取边缘信息。
- 采用了Sobel算子或其他方法对图像进行了局部分析。
- 将图片分割成细小的cell单元,在每个单元内统计其边缘特性。
- 将局部分析结果整合成较大的block结构,并对其内部特征进行了标准化处理与综合分析。
- 通过对各block中的边缘方向分布进行建模,在整体上构建了一个完整的边缘方向直方图集合。
例如下面是一个使用Python和scikit-image库实现HOG特征提取的例。
实例8-5:使用Python和scikit-image库实现HOG特征提取
源码路径:daima*8*hog.py**
import cv2
from skimage.feature import hog
def extract_hog_features(image):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
hog_features = hog(gray_image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), block_norm='L2-Hys')
return hog_features
# 读取图像
image = cv2.imread('image.jpg')
# 提取HOG特征
hog_features = extract_hog_features(image)
# 打印HOG特征向量
print('HOG Features:', hog_features)
代码解读
在给定的代码中,在处理流程开始之前,请先执行初始化配置操作。
随后读取并加载待处理图像。
接着调用extract_hog_features函数来获取图像的HOG特征向量。
在计算HOG特征的过程中,请注意以下参数设置:
- 设置梯度方向数量为9;
- 每个计算单元(cell)尺寸设置为8×8像素;
- 相邻单元(cells)组成block结构;
- 采用L2归一化处理以增强鲁棒性。
随后计算得到的HOG特征向量被输出至控制台进行显示。
执行后会输出:
HOG Features: [0.37306755 0.04656909 0.11781152 ... 0.02256336 0.00481969 0.00584473]
代码解读
该HOG特征可用于图像分类、目标检测以及人行分析等多个领域;它在刻画图像纹理与形状特征方面表现突出。当然,在不同应用场景下调整参数配置以达到最佳效果是可能的。
8.3.3 尺度不变特征变换
尺度不变特征变换(SIFT)是一种基于局部特征提取的方法
- 在多尺度空间框架内实施极值点检测算法,在每一层尺度空间中构建差分高斯(DoG)金字塔结构以获取目标图像的空间分布特性,并在此基础上提取图像上的极值点位置作为关键特征的位置信息。
- 实施关键特征定位过程时,则需要实现对初步检测得到的关键特征位置进行精确化定位处理,在实际应用过程中需剔除那些因对比度过低或边缘响应过强而导致误判的目标区域。
- 为了提高算法的整体性能,在完成初步的方向估计后需进一步根据优化准则确定每个目标区域的具体主方向参数设置。
- 在完成上述系列操作后,在目标区域中心附近建立适当大小的空间窗口并在此区域内展开梯度方向直方图统计过程以获得具有尺度和旋转不变特性的局部特征描述子。
例如下面是一个使用Python和OpenCV库实现SIFT特征提取的例子。
实例8-6:使用Python和OpenCV库实现SIFT特征提取
源码路径:daima*8*chi.py**
import cv2
def extract_sift_features(image):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray_image, None)
return keypoints, descriptors
# 读取图像
image = cv2.imread('image.jpg')
# 提取SIFT特征
keypoints, descriptors = extract_sift_features(image)
# 在图像上绘制关键点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 显示图像和关键点
cv2.imshow("Image with Keypoints", image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读
在给定代码中随后读取并加载待处理的图片随后调用extract_sift_features函数来获取该图片的sift特征描述接着在调用该函数的过程中将输入图片转换为灰度制式之后生成相应的sift实例对象随后通过调用detect_and_compute方法能够同时识别出关键点并计算出相应的特征描述子最后一步骤是在输出窗口中展示这些关键点的位置并对它们进行了标记执行效果如图8-1所示

图8-1 执行效果
SIFT特征在多个领域中得到广泛应用,在图像匹配、目标跟踪和图像拼接等应用中展现出强大的性能优势。该算法能够可靠地识别出具有尺度和旋转不变性的稳定特征点,并特别适用于处理视角变化和尺度变化的复杂图像数据。
8.3.4 小波变换
作为一种数学工具的小波变换,在不同频率与尺度上均可对信号进行有效的分解与表示能力。这种技术不仅可以实现对图像频域与空域信息的精准分离,在多尺度层面也可提取出丰富的纹理特征信息。作为一种多分辨率分析工具的小波变换,则可将原始信号或图像划分为多个子频带或子图象部分,并通过这些层次化的表征手段实现目标特性的确切刻画。在这一过程中不仅能够提取出各向异性方向上的纹理特征属性还可在各个空间位置上获取较为全面的局部能量分布情况等关键参数信息
实现小波变换的基本步骤如下:
- 根据需求选择适当的 wavelet 基函数: \psi 是用于信号分析的基本 wavelet 函数,在实际应用中常采用 Haar wavelet 或 db4 等类型。
- 通过多 scale decomposition, the image is decomposed into components across different frequencies and scales.
- Based on the analysis of wavelet coefficients at different scales and directions, texture features such as graininess, orientation, and contrast can be extracted from the image.
- By utilizing the extracted features, it is possible to perform an inverse small wavelet transform to reconstruct the image back to its original spatial domain.
以下是一个使用Python和PyWavelets库完成小波变换图像纹理特征提取的实例
实例8-7:使用PyWavelets库实现小波变换图像纹理特征提取
源码路径:daima*8*bo.py**
import cv2
import pywt
def extract_texture_features(image):
# 将图像转为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行小波变换
coeffs = pywt.dwt2(gray_image, 'haar')
cA, (cH, cV, cD) = coeffs
# 提取纹理特征
texture_features = {
'approximation': cA,
'horizontal_detail': cH,
'vertical_detail': cV,
'diagonal_detail': cD
}
return texture_features
# 读取图像
image = cv2.imread('image.jpg')
# 提取纹理特征
texture_features = extract_texture_features(image)
# 显示原始图像和纹理特征
cv2.imshow("Original Image", image)
cv2.imshow("Approximation", texture_features['approximation'])
cv2.imshow("Horizontal Detail", texture_features['horizontal_detail'])
cv2.imshow("Vertical Detail", texture_features['vertical_detail'])
cv2.imshow("Diagonal Detail", texture_features['diagonal_detail'])
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读
在给定的代码中

图8-2 执行效果
小波变换在图像纹理分析问题、图像分类问题中的识别以及图像压缩等领域得到了广泛的应用。该方法能够表征图像中多尺度和多方向上的纹理特征,在解决这些任务方面具有重要意义。
