目录

图像处理篇-opencv中的图像特征

图像处理篇—opencv中的图像特征



前言

OpenCV 提供了 多种传统图像特征提取方法 ,这些特征可以用于 机器学习任务(如图像分类、目标检测) 。以下是 OpenCV 中常用的 纹理特征(LBP)和形状特征(Hu矩) 的详细介绍,以及其他可用于 传统机器学习的特征


一、纹理特征:局部二值模式(LBP)

1. LBP 简介

局部二值模式(Local Binary Pattern, LBP) 是一种用于描述 图像局部纹理特征的算子 。它通过比较 像素点与其邻域像素的灰度值,生成二进制模式,进而提取纹理信息。

2. LBP 计算步骤

选择一个 中心像素点。

比较 中心像素点与其邻域像素的灰度值

如果 邻域像素值大于中心像素值 ,则标记为 1。

否则,标记为 0。

二进制结果转换为十进制数 ,作为该中心像素的 LBP 值。

对整个图像重复上述过程,生成 LBP 图像

3. OpenCV 实现

import cv2
import numpy as np

#读取图像并转换为灰度图
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

#计算 LBP 特征
radius = 1  # 邻域半径
n_points = 8 * radius  # 邻域像素点数
lbp = np.zeros_like(image, dtype=np.uint8)

for i in range(radius, image.shape[0] - radius):
    for j in range(radius, image.shape[1] - radius):
        center = image[i, j]
        binary = 0
        for k in range(n_points):
            x = i + int(radius * np.cos(2 * np.pi * k / n_points))
            y = j - int(radius * np.sin(2 * np.pi * k / n_points))
            binary |= (image[x, y] >= center) << k
        lbp[i, j] = binary

#显示 LBP 图像
cv2.imshow("LBP Image", lbp)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 优点

计算简单,速度快

光照变化具有一定的鲁棒性

5. 缺点

噪声敏感。

仅适用于局部纹理描述

二、形状特征:Hu矩

1. Hu矩简介

Hu矩是一种 基于图像几何矩的形状特征 ,具有 平移、旋转和缩放不变性 。它通过计算图像的 七个不变矩来描述图像的形状特征

2. Hu矩计算步骤

计算图像的 几何矩

计算 中心矩

归一化中心矩

计算 七个 Hu 不变矩

3. OpenCV 实现

import cv2

#读取图像并转换为灰度图
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)

#二值化图像
_, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

#计算 Hu 矩
moments = cv2.moments(binary)
hu_moments = cv2.HuMoments(moments)

#打印 Hu 矩
print("Hu Moments:", hu_moments.flatten())

4. 优点

具有 平移、旋转和缩放不变性

适用于 形状描述。

5. 缺点

噪声敏感。

仅适用于 全局形状描述。

三、其他可用于传统机器学习的特征

1. 颜色特征

颜色直方图

颜色直方图:描述图像中颜色的分布。

hist = cv2.calcHist([image], [0], None, [256], [0, 256])

颜色矩

颜色矩:计算图像颜色的 均值、方差和偏度

2. 边缘特征

Canny边缘检测

Canny 边缘检测: 提取图像的边缘信息。

edges = cv2.Canny(image, 100, 200)

HOG(方向梯度直方图)

HOG( 方向梯度直方图 ):描述图像的 局部形状和外观

hog = cv2.HOGDescriptor()
features = hog.compute(image)

3. 关键点特征

SIFT

SIFT:检测图像的 关键点并计算描述符。

sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(image, None)

SURF

SURF:类似于 SIFT,但 计算速度更快。

surf = cv2.xfeatures2d.SURF_create()
keypoints, descriptors = surf.detectAndCompute(image, None)

4. 纹理特征

Haralick纹理特征

Haralick 纹理特征:基于**灰度共生矩阵(GLCM)**计算纹理特征。

from skimage.feature import graycomatrix, graycoprops
glcm = graycomatrix(image, distances=[1], angles=[0], levels=256, symmetric=True, normed=True)
contrast = graycoprops(glcm, 'contrast')

5. 几何特征

轮廓特征

轮廓特征:提取图像中 物体的轮廓信息。

contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
    area = cv2.contourArea(contour)
    perimeter = cv2.arcLength(contour, True)

四、总结

1. LBP

用于 局部纹理描述。

计算简单,但对 噪声敏感。

2. Hu矩

用于 全局形状描述。

具有 平移、旋转和缩放不变性

3. 其他特征

颜色特征、边缘特征、关键点特征、纹理特征和几何特征 均可用于传统机器学习任务。

根据具体 任务选择合适的特征组合

通过结合多种特征,可以提 高传统机器学习模型在图像任务中的性能