HOG(Histogram of Oriented Gradients)——方向梯度直方图,是一种表示图像特征量的方法,特征量是表示图像的状态等的向量集合。

在图像识别(图像是什么)和检测(物体在图像的哪个位置)中,我们需要:

从图像中获取特征量(特征提取);

基于特征量识别和检测(识别和检测);

由于深度学习通过卷积网络自动执行特征提取和识别,所以看不到HOG,但在深度学习变得流行之前,HOG经常被用作特征量表达。

获得HOG算法如下:

图像灰度化,然后在x方向和y方向上求出亮度的梯度:

x方向:

y方向:

从g_x和g_y确定梯度幅值和梯度方向:

梯度幅值:

梯度方向:

将梯度方向[0,180]进行9等分量化。也就是说,对于[0,20]量化为index 0,对于[20,40]量化为index 1......

将图像划分为N x N个区域(该区域称为cell),并作出cell内上一步得到的index的直方图。

C x C个cell被称为一个block,对每个block内的cell的直方图通过下面的式子进行归一化。由于归一化过程中窗口一次移动一个cell来完成,因此一个cell会被归一化多次,通常ε=1。

以上,求出HOG特征值。

将得到的特征量可视化。为 cell 内的每个 index 的方向画一条线段,并且值越大,线段越白,

值越小,线段越黑。

import cv2

import numpy as np

import matplotlib.pyplot as plt

# get HOG

def HOG(img):

# Grayscale

def BGR2GRAY(img):

gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]

return gray

# Magnitude and gradient

def get_gradXY(gray):

H, W = gray.shape

# padding before grad

gray = np.pad(gray, (1, 1), 'edge')

# get grad x

gx = gray[1:H+1, 2:] - gray[1:H+1, :W]

# get grad y

gy = gray[2:, 1:W+1] - gray[:H, 1:W+1]

# replace 0 with

gx[gx == 0] = 1e-6

return gx, gy

# get magnitude and gradient

def get_MagGrad(gx, gy):

# get gradient maginitude

magnitude = np.sqrt(gx ** 2 + gy ** 2)

# get gradient angle

gradient = np.arctan(gy / gx)

gradient[gradient < 0] = np.pi / 2 + gradient[gradient < 0] + np.pi / 2

return magnitude, gradient

# Gradient quantization

def quantization(gradient):

# prepare quantization table

gradient_quantized = np.zeros_like(gradient, dtype=np.int)

# quantization base

d = np.pi / 9

# quantization

for i in range(9):

gradient_quantized[np.where((gradient >= d * i) & (gradient <= d * (i + 1)))] = i

return gradient_quantized

# get gradient histogram

def gradient_histogram(gradient_quantized, magnitude, N=8):

# get shape

H, W = magnitude.shape

# get cell num

cell_N_H = H // N

cell_N_W = W // N

histogram = np.zeros((cell_N_H, cell_N_W, 9), dtype=np.float32)

# each pixel

for y in range(cell_N_H):

for x in range(cell_N_W):

for j in range(N):

for i in range(N):

histogram[y, x, gradient_quantized[y * 4 + j, x * 4 + i]] += magnitude[y * 4 + j, x * 4 + i]

return histogram

# histogram normalization

def normalization(histogram, C=3, epsilon=1):

cell_N_H, cell_N_W, _ = histogram.shape

## each histogram

for y in range(cell_N_H):

for x in range(cell_N_W):

#for i in range(9):

histogram[y, x] /= np.sqrt(np.sum(histogram[max(y - 1, 0) : min(y + 2, cell_N_H),

max(x - 1, 0) : min(x + 2, cell_N_W)] ** 2) + epsilon)

return histogram

# 1. BGR -> Gray

gray = BGR2GRAY(img)

# 1. Gray -> Gradient x and y

gx, gy = get_gradXY(gray)

# 2. get gradient magnitude and angle

magnitude, gradient = get_MagGrad(gx, gy)

# 3. Quantization

gradient_quantized = quantization(gradient)

# 4. Gradient histogram

histogram = gradient_histogram(gradient_quantized, magnitude)

# 5. Histogram normalization

histogram = normalization(histogram)

return histogram

# draw HOG

def draw_HOG(img, histogram):

# Grayscale

def BGR2GRAY(img):

gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]

return gray

def draw(gray, histogram, N=8):

# get shape

H, W = gray.shape

cell_N_H, cell_N_W, _ = histogram.shape

## Draw

out = gray[1 : H + 1, 1 : W + 1].copy().astype(np.uint8)

for y in range(cell_N_H):

for x in range(cell_N_W):

cx = x * N + N // 2

cy = y * N + N // 2

x1 = cx + N // 2 - 1

y1 = cy

x2 = cx - N // 2 + 1

y2 = cy

h = histogram[y, x] / np.sum(histogram[y, x])

h /= h.max()

for c in range(9):

#angle = (20 * c + 10 - 90) / 180. * np.pi

# get angle

angle = (20 * c + 10) / 180. * np.pi

rx = int(np.sin(angle) * (x1 - cx) + np.cos(angle) * (y1 - cy) + cx)

ry = int(np.cos(angle) * (x1 - cx) - np.cos(angle) * (y1 - cy) + cy)

lx = int(np.sin(angle) * (x2 - cx) + np.cos(angle) * (y2 - cy) + cx)

ly = int(np.cos(angle) * (x2 - cx) - np.cos(angle) * (y2 - cy) + cy)

# color is HOG value

c = int(255. * h[c])

# draw line

cv2.line(out, (lx, ly), (rx, ry), (c, c, c), thickness=1)

return out

# get gray

gray = BGR2GRAY(img)

# draw HOG

out = draw(gray, histogram)

return out

# Read image

img = cv2.imread("../baby.png").astype(np.float32)

# get HOG

histogram = HOG(img)

# draw HOG

out = draw_HOG(img, histogram)

# Save result

cv2.imwrite("out.jpg", out)

cv2.imshow("result", out)

cv2.waitKey(0)

cv2.destroyAllWindows()

python 方向梯度直方图_手动绘制方向梯度直方图(HOG)相关推荐

  1. 手动绘制方向梯度直方图(HOG)

    HOG(Histogram of Oriented Gradients)--方向梯度直方图,是一种表示图像特征量的方法,特征量是表示图像的状态等的向量集合. 在图像识别(图像是什么)和检测(物体在图像 ...

  2. python sklearn 梯度下降法_(四)梯度下降法及其python实现

    梯度 梯度,什么是梯度?梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模). 在微积分里面,对多元函 ...

  3. python画条形图-用Matplotlib如何绘制条形图、直方图和散点图

    Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形. 上一篇我们讲解到Matplotlib 中的图例,标题和标签介绍,今天我们开 ...

  4. python创建画布大小_要绘制图形,首先需要显示画布,并设置画布的大小。其中turtle.setup()函数可以显示画布,并设置画布的大小,及画布在屏幕上的相对位置。_学小易找答案...

    [简答题]大脑左半球: [其它]11- 15 [简答题]音乐教育能 [单选题]177. 下列哪种方法不属于机械清蜡方法?( ) [判断题]审美价值的特性--精神性. [单选题]168. 储层改造技术也 ...

  5. python 目标直方图_深入了解扩展事件–直方图目标

    python 目标直方图 An Extended events target is the destination for all of the information that is capture ...

  6. python 立体图 交叉 平面_如何绘制相交平面?

    Matplotlib具有三维投影功能,但虚线在最终的二维图像视图中以恒定宽度绘制,看起来不像是平放在倾斜的平面上.如果几何结构很简单,而且"轨道"是圆形的,那么它可能会起作用,但是 ...

  7. 线性回归随机梯度下降_线性回归的批次梯度与随机梯度下降

    线性回归随机梯度下降 In this article, we will introduce about batch gradient and stochastic gradient descent m ...

  8. 【计算机视觉】方向梯度直方图(Histogram of Oriented Gradient,HOG)

    文章目录 1. HOG 简述 2. HOG 工作流程 第一步.对图像的颜色空间进行归一化 第二步.计算每个像素点的梯度 第三步.为每个单元构建梯度方向直方图 第四步.块内梯度直方图归一化 3. 举个例 ...

  9. matlab 频率分布直方图_小猿圈Python开发之绘制频率分布直方图示例

    现在人工智能越来越实用,甚至深入到千家万户,随之而来的就是python技术的火爆,今天小猿圈python讲师为你讲解一下绘制频率分布直方图示例,希望对于刚刚自学python的你有一定的帮助. 项目中在 ...

最新文章

  1. 错误: 找不到android.support.v7.app.AppCompatActivity的类文件
  2. scala 学习笔记(07) 一等公民的函数
  3. 启动服务错误5拒绝访问_【Go API 开发实战 5】基础1:启动一个最简单的 RESTful API 服务器...
  4. 聊几个与赚钱相关的小事情
  5. ios开发基础之通讯录系统实战-20
  6. 适配器模式和装饰模式
  7. 企业数字化转型到底是什么?带你一图看懂答案
  8. iMac 是什么?苹果2021新款 iMac 购买建议
  9. 龙芯录取通知书引争议 中科院回复:龙芯不是汉芯
  10. 腾讯手机指纹认证标准:soter原理
  11. X-Cash空投领取教程
  12. 阿里云国际站和阿里云国内站有什么区别?
  13. 云服务器ECS选购集锦之九云服务器选购常见FAQ
  14. Python基础知识-pycharm版-02
  15. linux 自动mv脚本,linux replace rm to mv(脚本)
  16. 计算机视觉知识学习总结
  17. html5 幽灵按钮,弥散阴影幽灵按钮
  18. 分享:Android 实验
  19. 直击视频会议行业五大痛点提出企业视频会议通话完美解决方案
  20. Java多线程-将全量用户表70万数据压缩并生成CSV文件和推送到FTP上(最快快方式)

热门文章

  1. uml 类图_UML 类图
  2. python程序设计课后答案祁瑞华_清华大学出版社-图书详情-《Python 程序设计》
  3. im即时通讯源码_IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
  4. centos7安装postgresql数据库
  5. 【问题】vs IIS破除文件上传限制最全版
  6. 递归算法转换为非递归算法的技巧
  7. Hibernate懒加载解析
  8. iOS6.0下获取通讯录用户列表
  9. 单向链表的有关操作(链式存储结构)
  10. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别