图像处理篇---opencv中的图像特征
文章目录
- 前言
- 一、纹理特征:局部二值模式(LBP)
- 1. LBP 简介
- 2. LBP 计算步骤
- 3. OpenCV 实现
- 4. 优点
- 5. 缺点
- 二、形状特征:Hu矩
- 1. Hu矩简介
- 2. Hu矩计算步骤
- 3. OpenCV 实现
- 4. 优点
- 5. 缺点
- 三、其他可用于传统机器学习的特征
- 1. 颜色特征
- 颜色直方图
- 颜色矩
- 2. 边缘特征
- Canny边缘检测
- HOG(方向梯度直方图)
- 3. 关键点特征
- SIFT
- SURF
- 4. 纹理特征
- Haralick纹理特征
- 5. 几何特征
- 轮廓特征
- 四、总结
- 1. LBP
- 2. Hu矩
- 3. 其他特征
前言
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. 其他特征
颜色特征、边缘特征、关键点特征、纹理特征和几何特征均可用于传统机器学习任务。
根据具体任务选择合适的特征组合。
通过结合多种特征,可以提高传统机器学习模型在图像任务中的性能。