【图像处理7】HOG特征

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from skimage.feature import hog
import numpy as np
import cv2

"""

hog 方向梯度直方图:

1. 对图像进行Gamma校正,即整体的调节亮度、对比度(显示器存在偏色情况等)

    1.1 取Gamma值为2,则gamma系数为1/gamma = 0.5
    1.2 归一化每个像素的灰度值,即gray_value/255
    1.3 根据ganmma系数条件,即(gray_value/255)^(1/gamma)
    1.4 反归一化,回到【0, 255】
    1.5 gamma值小于1整体变亮,反之变暗;

2. 计算每个像素的梯度和方向
    
    2.1 采用[-1,0,1]卷积得到x方向梯度分量tx
    2.2 采用[1,0,-1]T卷积得到y方向梯度分量ty
    2.3 计算该像素的梯度值及方向,即t = sqrt(tx^2 + ty^2), arctan(ty/tx)

3. 取6*6的cell,在每个cell里绘制直方图
    
    3.1 直方图的x轴是360度,分为9个区间;
    3.2 若某个像素的梯度方向属于这个区间,则该区间的值加上该像素的梯度量
    注意:这里的直方图不是我们传统意义上的矩形直方图,而是从中心点放射出去的直方图,类似星星状;


4. 将所有的小cell整合起来 

HOG特征本质上就是利用最强的梯度来识别图像的边缘,代码逻辑比较简单,直接采用skimage库测试

"""

path = '/XXX/'
img  = cv2.imread(path + 'lena.jpg')

img_gray       = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img_gray_array = np.array(img_gray)

normalised_blocks, hog_image = hog(img_gray_array, orientations=9, 
    pixels_per_cell=(8, 8), cells_per_block=(8, 8), visualise=True)

plt.subplot(121)
plt.imshow(img_gray, cmap='gray')
plt.subplot(122)
plt.imshow(hog_image, cmap='gray')
plt.show()

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章