本文へスキップ

HOG特徴量をTypeScriptで実装して可視化する【画像処理100本ノック】

3
AIで生成された記事

概要

Q.66〜69では、物体の輪郭や形状を表すHOG(Histogram of Oriented Gradients)特徴量を 4段階で実装します。後半の画像認識と物体検出でも再利用する重要な特徴量です。

勾配強度と角度(Q.66)

x方向とy方向の輝度差から勾配を求めます。

const magnitude = Math.sqrt(gx * gx + gy * gy);
const angle = (Math.atan2(gy, gx) * 180) / Math.PI;

向きの反転を同じ輪郭として扱うため角度を0〜180度へ収め、20度刻みの9方向へ量子化します。

セルごとの方向ヒストグラム(Q.67)

画像を8×8画素のセルに分けます。各画素の勾配強度を、その角度に対応するビンへ加算します。 これにより64画素の情報を「どの向きの輪郭がどれだけ強いか」という9次元の値へ要約します。

ブロック正規化(Q.68)

周囲3×3セルのヒストグラムを使ってL2正規化します。

normalized = value / sqrt(sum(value²) + ε)

局所的な明るさやコントラストが変わっても、輪郭方向の比率を比較しやすくなります。

特徴量を描画する(Q.69)

各セルの中心から、9方向のヒストグラム値に比例した長さの線を描きます。数値配列だけでは 分かりにくいHOGが、物体の輪郭に沿った線の集合として見えるようになります。

HOGが後続処理で果たす役割

RGB画素をそのまま学習器へ入れる代わりに、HOGで形状を表す特徴ベクトルへ変換します。 Q.96のニューラルネットワーク学習とQ.97以降のスライディングウィンドウでは、同じHOG実装を 使って顔らしさを判定します。

勾配をヒストグラムへ入れる

各画素でgxgyを求め、強度m = sqrt(gx² + gy²)と方向 θ = atan2(gy, gx)へ変換します。明暗が反転しても同じ輪郭として扱うHOGでは、方向を 0〜180度へ正規化します。

方向を最も近いビンへ丸めるだけでなく、隣接する2ビンへ角度距離に応じて強度を分配すると、 ビン境界付近で特徴量が急変しにくくなります。セル境界についても周囲へ補間する実装があります。

ブロック正規化の実装

隣接セルをブロックとして連結し、L2正規化する例は次の式です。

v' = v / sqrt(Σv² + ε²)

εは一様領域で分母が0になることを防ぎます。ブロックを重ねながら走査するため、1つのセルが 複数回正規化される点がHOGの特徴です。セル数、方向ビン数、ブロックサイズから最終ベクトルの 次元数を計算し、配列長をテストすると走査漏れを見つけやすくなります。

セルを小さくすれば細かな形状を表せますが、次元数と計算量が増え、位置ずれにも敏感になります。 分類器まで含めて精度と処理時間を比較してパラメータを決めます。

おすすめの記事

最新の記事

著者について

404

s-yoshiki

ただの備忘録です。

※外部送信に関する公表事項