【圖像處理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()

在這裏插入圖片描述

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