HOG機能記述オペレーター| Datawhale Juneチームスタディ(タスク4)

序文

HOGは、方向付けられた勾配のヒストグラムの略で、方向付けられた勾配のヒストグラムに従って画像の特性を見つけることです。画像のオブジェクトの特徴を表すために使用できるため、そのようなオブジェクトを検出できます。(下の写真はHOGによって抽出された特徴を示しています)
ここに画像の説明を挿入

HOG特徴記述子抽出プロセス:

  • グレースケール画像変換
  • 勾配計算
  • サブグリッドの勾配方向ヒストグラム
  • ブロック記述子
  • ブロック記述子の正規化

1理論

1.1勾配計算

勾配ヒストグラムを取得するには、最初に水平勾配と垂直勾配を計算する必要があります。これは、水平勾配と垂直勾配をそれぞれ計算するために使用される次のカーネルを使用して画像をフィルタリングすることで実現できます。
ここに画像の説明を挿入

#调节图像对比度,减少光照对图像的影响
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('*.png', 0)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img2 = np.power(img/float(np.max(img)),1/2.2)
plt.imshow(img2)
plt.axis('off')
plt.show()
img = np.float32(img2) / 255.0  # 归一化# 计算x和y方向的梯度
gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1)# 计算合梯度的幅值和方向(角度)
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

1.2サブグリッドの勾配方向ヒストグラム

それを8 * 8 = 64ピクセルのセルグリッド(下図の緑色のグリッド)に分割し、各セルの方向ヒストグラムを取得します。

各8 * 8セル勾配ヒストグラムは、基本的に9つの値で構成されるベクトルであり、0、20、40、60 ... 160の勾配方向(角度)、つまり9つのビンに対応します。次に、各ビンの勾配の寄与をカウントします。
ここに画像の説明を挿入

1.3ブロック記述子

2×2のグリッドセルを1つの大きなブロックに結合し、各ブロックの半分が重なり合う領域になります。
主に、各セルのヒストグラムが大きなヒストグラムにマージされます(ビンインデックスは変更されません、0〜8の間)
ここに画像の説明を挿入
。上の図からわかるように、より多くのポイントの勾配方向は0度と160度になる傾向があります。これらのポイントの勾配方向が上向きまたは下向きであることは、画像のこの位置に比較的明白な水平エッジがあることを示しています。したがって、HOGはコーナーに敏感であり、このような統計手法は一部のピクセル値の変化にも鈍感であるため、さまざまな環境に適応できます。

1.4ブロック記述子の正規化

多くの正規化方法があります。L1-ノルム、L2-ノルム、最大/最小など、通常はL2-ノルムを選択します。
ここに画像の説明を挿入

2コード

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    src = cv.imread("D:/python_opencv/stand.jpg")
    cv.imshow("input", src)
    
    hog = cv.HOGDescriptor()
    hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
    # Detect people in the image
    (rects, weights) = hog.detectMultiScale(src,
                                            winStride=(2,4),
                                            padding=(8, 8),
                                            scale=1.2,
                                            useMeanshiftGrouping=False)
    for (x, y, w, h) in rects:
        cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv.imshow("peoples", src)
    #cv.imwrite("peoples.jpg",src)
    cv.waitKey(0)
    cv.destroyAllWindows()

ここに画像の説明を挿入
特定の部分を改善する必要があり、最適な解決策は後で見つかります。

おすすめ

転載: blog.csdn.net/weixin_42326479/article/details/107168633