# -*- 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()
【圖像處理7】HOG特徵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.