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

发布于:2025-03-09 ⋅ 阅读:(100) ⋅ 点赞:(0)


前言

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. 其他特征

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

根据具体任务选择合适的特征组合
通过结合多种特征,可以提高传统机器学习模型在图像任务中的性能



网站公告

今日签到

点亮在社区的每一天
去签到