注意
跳到結尾以下載完整範例程式碼。或透過 Binder 在您的瀏覽器中執行此範例
方向梯度直方圖#
方向梯度直方圖 (HOG) 特徵描述符在物件偵測中很受歡迎[1]。
在以下範例中,我們計算HOG 描述符並顯示視覺化。
演算法概述#
透過以下方式計算方向梯度直方圖 (HOG)
(可選)全域影像正規化
計算 x 和 y 中的梯度影像
計算梯度直方圖
跨區塊正規化
展平成特徵向量
第一階段會套用一個可選的全域影像正規化均衡,旨在減少照明效果的影響。在實務中,我們使用伽瑪(冪律)壓縮,計算每個顏色通道的平方根或對數。影像紋理強度通常與局部表面照明成正比,因此這種壓縮有助於減少局部陰影和照明變化的影響。
第二階段計算一階影像梯度。這些捕捉輪廓、剪影和一些紋理資訊,同時進一步抵抗照明變化。使用局部主導顏色通道,在很大程度上提供色彩不變性。變異方法也可能包括二階影像導數,它充當原始條形偵測器 - 這是一個有用的特徵,用於捕捉例如自行車中的條形結構和人類的肢體。
第三階段旨在產生對局部影像內容敏感,同時保持對姿勢或外觀的微小變化具有抵抗力的編碼。採用的方法以與 SIFT [2] 特徵相同的方式在局部匯集梯度方向資訊。影像視窗分為小的空間區域,稱為「儲存格」。對於每個儲存格,我們會在儲存格中的所有像素上累積梯度或邊緣方向的局部一維直方圖。這種組合的儲存格級一維直方圖形成基本的「方向直方圖」表示。每個方向直方圖將梯度角度範圍劃分為固定數量的預定組距。使用儲存格中像素的梯度大小來投票到方向直方圖中。
第四階段計算正規化,它會取得儲存格的局部群組並對其整體回應進行對比正規化,然後再傳遞到下一階段。正規化引入了更好的照明、陰影和邊緣對比不變性。透過在我們稱為「區塊」的儲存格局部群組上累積局部直方圖「能量」的度量來執行。結果用於正規化區塊中的每個儲存格。通常,每個單獨的儲存格會在多個區塊之間共用,但其正規化是區塊相依的,因此不同。因此,儲存格會在最終輸出向量中多次出現,並帶有不同的正規化。這可能看起來是多餘的,但它提高了效能。我們將正規化的區塊描述符稱為方向梯度直方圖 (HOG) 描述符。
最後一個步驟是將涵蓋偵測視窗的密集重疊區塊網格中所有區塊的 HOG 描述符收集到一個組合特徵向量中,以便在視窗分類器中使用。
參考文獻#

import matplotlib.pyplot as plt
from skimage.feature import hog
from skimage import data, exposure
image = data.astronaut()
fd, hog_image = hog(
image,
orientations=8,
pixels_per_cell=(16, 16),
cells_per_block=(1, 1),
visualize=True,
channel_axis=-1,
)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)
ax1.axis('off')
ax1.imshow(image, cmap=plt.cm.gray)
ax1.set_title('Input image')
# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 10))
ax2.axis('off')
ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray)
ax2.set_title('Histogram of Oriented Gradients')
plt.show()
腳本的總執行時間: (0 分鐘 0.677 秒)