HOG特征检测

HOG特征检测通过计算局部区域的梯度方向直方图来构成特征,用于描述图像边缘和形状信息。它包括检测窗口、块和单元格的定义,并在OpenCV中有详细实现。HOG与SIFT的主要区别在于目标和处理方式,HOG适用于边缘结构的描述,且不涉及特征点提取。尽管HOG能抵抗光照变化,但速度慢,对遮挡和噪点敏感。常用于HOG+SVM的行人检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HOG特征检测,它是通过计算局部区域的梯度方向直方图来构成特征。

其中检测窗口Win、块Block、单元格Cell的基本信息

(1)大小:

A、检测窗口:WinSize=128*64像素,在图像中滑动的步长是8像素(水平和垂直都是)

B、块:BlockSize=16*16像素,在检测窗口中滑动的步长是8像素(水平和垂直都是)

C、单元格:CellSize=8*8像素

D、梯度方向:一个Cell的梯度方向分为9个方向,在一个单元格内统计9个方向的梯度直方图

(2)HOG描述子

    OpenCV中一个Hog描述子是针对一个检测窗口而言的,一个检测窗口有((128-16)/8+1)*((64-16)/8+1)=105个Block,一个Block有4个Cell,一个Cell的Hog描述子向量的长度是9,所以一个检测窗口的Hog描述子的向量长度是105*4*9=3780维。

    HOG特征提取是统计梯度直方图特征。具体来说就是将梯度方向(0->360°)划分为9个区间,将图像化为16x16的若干个block,每个block再化为4个cell(8x8)。对每一个cell,算出每一像素点的梯度方向和模,按梯度方向增加对应bin的值,最终综合N个cell的梯度直方图形成一个高维描述子向量<

HOG(Histogram of Oriented Gradient)特征检测是一种在计算机视觉领域广泛应用的方法,用于检测图像中的。下面是一个简单的Python实现,具体如下: ```python import cv2 import numpy as np def hog_corner_detection(img, blockSize=2, ksize=3, k=0.04, threshold=0.1): # 计算x和y方向的Sobel导数 sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=ksize) sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=ksize) # 计算Ix^2, Iy^2, Ix*Iy Ix2 = sobelx ** 2 Iy2 = sobely ** 2 Ixy = sobelx * sobely # 在每个像素周围计算积分和 height, width = img.shape Sx2 = np.zeros((height, width)) Sy2 = np.zeros((height, width)) Sxy = np.zeros((height, width)) for i in range(height): for j in range(width): if i == 0 or j == 0: Sx2[i][j] = Ix2[i][j] Sy2[i][j] = Iy2[i][j] Sxy[i][j] = Ixy[i][j] else: Sx2[i][j] = Sx2[i-1][j] + Ix2[i][j] Sy2[i][j] = Sy2[i][j-1] + Iy2[i][j] Sxy[i][j] = Sxy[i-1][j] + Sxy[i][j-1] + Ixy[i][j] - Sxy[i-1][j-1] # 计算每个像素的响应函数值 R = np.zeros((height, width)) for i in range(blockSize, height-blockSize): for j in range(blockSize, width-blockSize): # 计算每个块的Sx2, Sy2, Sxy Sx2_block = Sx2[i-blockSize:i+1+blockSize, j-blockSize:j+1+blockSize] Sy2_block = Sy2[i-blockSize:i+1+blockSize, j-blockSize:j+1+blockSize] Sxy_block = Sxy[i-blockSize:i+1+blockSize, j-blockSize:j+1+blockSize] # 计算块内响应函数值 det = Sx2_block * Sy2_block - Sxy_block ** 2 trace = Sx2_block + Sy2_block R[i][j] = np.min(det) / (np.max(trace) + 1e-12) # 选取响应函数值大于阈值的像素位置作为 corners = [] for i in range(height): for j in range(width): if R[i][j] > threshold: corners.append((i, j)) return corners ``` 其中,`img`是输入的灰度图像,`blockSize`是块的大小(默认为2),`ksize`是Sobel算子的大小(默认为3),`k`是常数因子(默认为0.04),`threshold`是响应函数值的阈值(默认为0.1)。函数返回一个列表,其中包含检测到的的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值