Python实现提取图像的纹理、颜色特征,包含快速灰度共现矩阵(GLCM)、LBP特征、颜色矩、颜色直方图。
文章目录
Python实现提取图像的纹理、颜色特征
在图像处理和计算机视觉领域,特征提取是理解图像内容的关键步骤。本文将详细介绍如何使用Python实现从图像中提取纹理和颜色特征,包括快速灰度共现矩阵(GLCM)、局部二值模式(LBP)特征、颜色矩以及颜色直方图。
一、原始图片展示
首先,我们需要加载并显示一张用于特征提取的原始图片。这里我们使用skimage
库中的内置图像作为示例:
from skimage import data
import matplotlib.pyplot as plt
img = data.camera() # 加载内置的相机图像
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.show()
二、纹理特征提取
1. 快速灰度共生矩阵(GLCM)
GLCM是一种经典的纹理分析方法,通过计算不同像素之间的空间关系来描述图像的纹理特性。下面是如何使用fast_glcm
库来高效地计算GLCM均值:
import fast_glcm
from skimage import data
if __name__ == '__main__':
img = data.camera()
glcm_mean = fast_glcm.fast_glcm_mean(img)
plt.imshow(glcm_mean, cmap='gray')
plt.title('GLCM Mean')
plt.show()
这个脚本展示了如何在没有每个像素for循环的情况下计算GLCM,并且其效率高于scikit-image
上的GLCM实现。
2. 局部二值模式(LBP)
LBP是一种有效的纹理描述符,广泛应用于人脸识别等领域。以下是获取LBP特征的方法:
- 原始LBP模式:直接根据邻域像素与中心像素的比较结果生成。
- 等价LBP模式:减少模式数量以简化表示。
- 旋转不变LBP模式:使得特征对旋转具有不变性。
- 等价旋转不变LBP模式:结合了上述两种特性。
主要文件get_LBP_from_Image.py
用于获取图像的LBP特征。辅助文件如get_resolve_map.py
和get_uniform_map.py
帮助理解算法降维后新的像素值如何得到,并已将求出的结果写入主文件中。
# 示例代码片段
from skimage.feature import local_binary_pattern
import numpy as np
def get_lbp(image, P=8, R=1):
lbp = local_binary_pattern(image, P, R, method="uniform")
return lbp
lbp_image = get_lbp(img)
plt.imshow(lbp_image, cmap='gray')
plt.title('LBP Feature Map')
plt.show()
三、颜色特征提取
1. 颜色矩
颜色矩是一种简单而有效的颜色特征表示方法,包含一阶矩(均值)、二阶矩(方差)和三阶矩(斜度)。这些统计量足以表达图像的颜色分布。
def color_moments(image):
channels = cv2.split(image)
features = []
for channel in channels:
mean = np.mean(channel)
std = np.std(channel)
skewness = np.mean(((channel - mean) / (std + 1e-7)) ** 3)
features.extend([mean, std, skewness])
return features
color_features = color_moments(cv2.cvtColor(img, cv2.COLOR_GRAY2BGR))
print("Color Moments:", color_features)
颜色矩的优点在于不需要颜色空间量化,特征向量维数低,但检索效率较低,通常用于过滤图像以缩小检索范围。
2. 颜色直方图
颜色直方图是一种常见的颜色特征提取方法,它记录了每种颜色在图像中出现的频率。可以通过以下方式计算:
import cv2
def color_histogram(image, bins=[8, 8, 8]):
hist = cv2.calcHist([image], [0, 1, 2], None, bins, [0, 256, 0, 256, 0, 256])
cv2.normalize(hist, hist)
return hist.flatten()
histogram = color_histogram(cv2.cvtColor(img, cv2.COLOR_GRAY2BGR))
print("Color Histogram:", histogram)
四、总结
本文详细介绍了如何使用Python从图像中提取纹理和颜色特征,具体包括:
- 使用
fast_glcm
库高效计算灰度共生矩阵(GLCM),这是一种强大的纹理描述工具。 - 通过局部二值模式(LBP)捕捉图像的纹理信息,适用于多种应用场景,尤其是人脸检测。
- 利用颜色矩提供一种低维、无需颜色空间量化的颜色特征表示方法,尽管其检索效率相对较低。
- 采用颜色直方图记录颜色在图像中的分布情况,为图像分类和检索提供了基础。
这些技术不仅有助于深入理解图像的内容,也为后续的图像处理任务如分类、检索等提供了强有力的支持。无论是研究还是实际应用中,掌握这些特征提取方法都是非常有价值的。未来的工作可以考虑将这些特征与其他机器学习或深度学习模型结合,进一步提升图像分析的效果。