用python写一个HOG算法
时间: 2024-06-09 07:10:05 浏览: 5
好的,以下是用 Python 实现 HOG(方向梯度直方图)算法的代码:
```python
import cv2
import numpy as np
# 构建 HOG 描述符的函数
def hog_descriptor(image):
# 图像灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 计算图像梯度
gx = cv2.Sobel(gray, cv2.CV_32F, 1, 0)
gy = cv2.Sobel(gray, cv2.CV_32F, 0, 1)
# 计算梯度幅值和方向
mag, ang = cv2.cartToPolar(gx, gy)
# 将角度转换为度数
ang = ang * 180 / np.pi
# 将角度划分为 8 个方向
bins = np.int32(ang / 45.0) % 8
# 将图像划分为 8x8 的单元格
cell_size = (8, 8)
block_size = (2, 2)
h, w = gray.shape
n_cellsx = w // cell_size[0]
n_cellsy = h // cell_size[1]
cells = [np.zeros((cell_size[0], cell_size[1], 8), dtype=np.float32)
for i in range(n_cellsy * n_cellsx)]
for i in range(n_cellsy):
for j in range(n_cellsx):
cell_mag = mag[i * cell_size[1]: (i + 1) * cell_size[1],
j * cell_size[0]: (j + 1) * cell_size[0]]
cell_bin = bins[i * cell_size[1]: (i + 1) * cell_size[1],
j * cell_size[0]: (j + 1) * cell_size[0]]
for b in range(8):
cells[i * n_cellsx + j][:, :, b] = ((cell_bin == b)
* cell_mag)
# 计算每个块的 HOG 描述符
hog = np.zeros((n_cellsy - block_size[1] + 1,
n_cellsx - block_size[0] + 1,
block_size[0] * block_size[1] * 8),
dtype=np.float32)
for i in range(n_cellsy - block_size[1] + 1):
for j in range(n_cellsx - block_size[0] + 1):
block = []
for y in range(block_size[1]):
for x in range(block_size[0]):
block.append(cells[(i + y) * n_cellsx + (j + x)])
block = np.array(block).flatten()
hog[i, j, :] = block / np.sqrt(np.sum(block ** 2) + 1e-6)
return hog.flatten()
```
这个函数的输入是一个图像,输出是一个一维数组,表示该图像的 HOG 描述符。在这个函数中,我们首先将图像转换为灰度图像,然后计算图像的梯度。接着,我们将梯度幅值和方向划分为 8 个方向,并将图像划分为 8x8 的单元格。对于每个单元格,我们计算每个方向的梯度的大小,并将它们存储在一个 8 维向量中。然后,我们将图像划分为 2x2 的块,并计算每个块的 HOG 描述符。最后,我们将所有块的 HOG 描述符连接起来,形成一个一维数组。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)