图像处理中的HOG特征提取及应用

版权申诉
0 下载量 161 浏览量 更新于2024-10-04 收藏 497KB RAR 举报
HOG特征最早由Navneet Dalal和Bill Triggs在2005年提出,旨在通过捕获图像的局部形状信息来描述图像中的物体,这些信息对物体的位置、姿态以及光照变化具有良好的不变性。HOG特征提取过程主要包括以下几个步骤: 1. 计算图像梯度:首先对图像进行梯度计算,即求出图像中每个像素点的水平和垂直梯度,分别对应于图像的亮度变化在水平和垂直方向上的分量。常见的梯度计算方法包括Sobel算子、Prewitt算子等。 2. 计算梯度幅值和方向:根据计算出的水平和垂直梯度分量,求出梯度的幅值和方向。梯度幅值反映了图像中该点的边缘强度,而梯度方向则反映了边缘的方向。 3. 构建梯度直方图:将图像划分为小的连接区域,称为‘细胞单元’。对于每个细胞单元,计算其中所有像素点的梯度方向的直方图。直方图的每个柱子对应一个特定的方向范围,例如90度范围内。在计算直方图时,通常会对图像进行局部归一化,以减少光照变化的影响。 4. 组合细胞单元形成块(Block):将多个细胞单元组合起来形成较大的块,并且对每个块内的细胞单元的直方图进行投票,形成块的描述符。 5. 归一化处理:对块的描述符进行归一化处理,通常是利用块周围的其他块的直方图信息来实现,这一步骤可以进一步提高HOG特征对光照变化的鲁棒性。 HOG特征因其良好的性能,在行人检测、车辆识别等图像处理应用中得到了广泛的应用。本资源是一个基于Matlab编写的程序,可以实现HOG特征的提取,为用户提供了一个直接在Matlab环境下进行HOG特征提取和后续图像处理应用的便捷途径。" 【重要提醒】:请确保在使用本资源时,您的工作环境已经安装了Matlab软件,并且熟悉Matlab的基本操作和编程方法。此外,理解和调整HOG特征提取过程中的参数对于最终提取特征的效果具有重要影响。在不同的应用场景中,可能需要对细胞单元的大小、块的大小、方向梯度的量化等级等参数进行细致的调整以获得最佳的识别效果。

import cv2 import numpy as np import os # 提取图像的HOG特征 def get_hog_features(image): hog = cv2.HOGDescriptor() hog_features = hog.compute(image) return hog_features # 加载训练数据集 train_data = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128"] train_labels = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128\labels.txt"] num_samples = 681 for i in range(num_samples): img = cv2.imread(str(i).zfill(3)+'.jpg') hog_features = get_hog_features(image) hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) color_hist = cv2.calcHist([hsv_image], [0, 1], None, [180, 256], [0, 180, 0, 256]) color_features = cv2.normalize(color_hist, color_hist).flatten() train_data.append(hog_features) train_labels.append(labels[i]) # 训练SVM模型 svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.train(np.array(train_data), cv2.ml.ROW_SAMPLE, np.array(train_labels)) # 对测试图像进行分类 test_image = cv2.imread('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\maskslic2_roi.png', 0) test_features = get_hog_features(test_image) result = svm.predict(test_features.reshape(1,-1)) # 显示分割结果 result_image = np.zeros(test_image.shape, np.uint8) for i in range(test_image.shape[0]): for j in range(test_image.shape[1]): if result[i,j] == 1: result_image[i,j] = 255 cv2.imshow('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\Result.png', result_image) cv2.waitKey(0) cv2.destroyAllWindows()

154 浏览量