코딩 및 기타/이미지
HOG ( Histogram of Oriented Gradients )
정지홍
2025. 1. 10. 13:14
서론
- 이미지를 feature vector로 변환하는것은, 이를 머신러닝 알고리즘에 적용하기 전에 하는 전처리 단계중 하나이다.
즉, image data를 가지고 ml 알고리즘에 넣기전에 전처리 하는 것은 전형적인 일이며, 그래야 알고리즘이 동작한다.
- 위와 같은 과정을 거치는 이유는 image를 feature vector로 나타내는 것이 더 효율적이기 때문이다.
- 이때 자주 사용하는 기법은 HOG , BoW가 존재한다.
- Histogram of Oriented Gradients ( 기울기를 지향하는 히스토그램? )
- Bag-of-Words
- 만약 20 X 20 pixel image가 있다면 opencv에서는 이를 길이가 400인 1D vector(feature)로 표현한다.
- 하지만, 위의 과정은 각각의 pixel에 대해서 나타내며, ml알고리즘에서 매번 feedback받기에는 비 효율적이며, 특히 input feature data의 길이가 크면 클수록 더욱이 효율이 감소한다.
서론에서는 feature가 많아질수록 효율이 감소한다고 했다.
그러면 우리는 이러한 input data에 대해서 feature( 혹은 차원)을 줄여야한다.
- 그래서 우리는 필요한 feature들이 뽑아내기 위해서 HOG나 Bow와 같은 기법을 사용한다.

이미지에서 기울기란?
- 이미지의 색상 or 밝기 변화율을 나타내는 벡터이다.
- 기울기는 수평,수직으로 나뉜다.
- Gx가 수평이라면, 이미지의 가로 방향으로 픽셀값의 변화율을 계산한다.
- sobel kernel을 가지고 계산함
- 기울기가 작으면 주변 픽셀과 유사하다는것. 기울기가 크면 주변과 차이가 난다는것
- Gy가 수직이라면, 이미지의 세로 방향으로 픽셀 값의 변화율을 계산한다.
- 이것두 sobel kernel로 계산...
- Gx가 수평이라면, 이미지의 가로 방향으로 픽셀값의 변화율을 계산한다.
- 기울기의 크기는 G = √(Gx² + Gy²) 로 계산됨
- 기울기의 방향은 θ = arctan(Gy/Gx)로 계산됨

HOG
- 국소적인 기울기 방향을 분석해서 feature를 추출하는 기법
- 과정
- 1. 기울기 계산
- 이미지에서 pixel간의 밝기 차이를 계산해서 edge와 텍스처 정보를 추출한다.
- 일반적으로 sobel 연산자 를 사용 얻은 sobel filter를 사용해서, 각 픽셀의 기울기 값을 계산
- 기울기 값에는 크기와 방향이 존재
- 기울기의 크기는 경계의 강도를 의미. graident magnitude
- 기울기의 방향은 경계의 방향을 나타냄. gradient direction
- 기울기 값에는 크기와 방향이 존재
- 2. 이미지를 작은 구역cell로 나눈다.
- ex) 8x8 pixel크기의 cell
- 각 cell에서 위에서 계산한 기울기 방향 정보를 히스토그램 형태로 표현함
- 3. 히스토그램 계산
- 각 cell에서 계산된 gradient direction을 여러개의 방향bin으로 나누고, 해당 0° ~ 20°, 20° ~ 40°, ..., 160° ~ 180°로 9개의 방향 bin을 사용할 수 있습니다. 를 누적해서 히스토그램을 만든다.
- 여러 bin으로 나눈다???
- 그래프1을 보면 기울기의 각도는 총 0~180˚으로 나올것이다. 그러면 예를 들어서 0° ~ 20°, 20° ~ 40°, ..., 160° ~ 180°로 한다면 총 9개의 방향 bin을 만들 것이다.
- graident magnitude를 누적한다???
- 각 pixel의 graident magnitude를 해당되는 gradient direction의 bin에 누적시킨다.
즉, 기울기의 크기는 히스토그램 값의 가중치로 이용되는거임. ( 맞는 bin이 없다면 인접한 bin에게 비례적으로 분배함)- ex) 특정 픽셀이 45° 방향이고 기울기 크기가 10이라면, 40° ~ 60° bin에 10을 더한다.
- 각 pixel의 graident magnitude를 해당되는 gradient direction의 bin에 누적시킨다.
- 여러 bin으로 나눈다???
- 결과적으로 각 cell에서 방향bin에 따른 히스토그램이 생성된다.
- 각 cell에서 계산된 gradient direction을 여러개의 방향bin으로 나누고, 해당 0° ~ 20°, 20° ~ 40°, ..., 160° ~ 180°로 9개의 방향 bin을 사용할 수 있습니다. 를 누적해서 히스토그램을 만든다.
- 4. 여러 cell을 묶어서 block을 만든다.
- ex) 2x2 cell을 하나의 블록으로 묶음. 즉, 4개의 cell을 하나의 block으로 만드는 것.
- 5. block을 가지고 정규화(normalization)를 시켜서 밝기 변화의 영향을 제거한다.
- 정규화를 통해서 이미지의 명암 차이에 더 강건해짐
- 6. 특징 vector 생성
- 모든 block에서 계산된 히스토그램을 하나의 feature vector로 만든다. 이것이 ml의 input data로 사용됨.
- 하나의 feature vector로 만든다???
- 여러 block에서 계산된 값들을 하나의 긴 vector로 이어 붙인다는 것.
- ex) 이 미지에 4개의 블록이 있고 각 블록에 대해 계산된 히스토그램이 9개 값이라면, 그 히스토그램은 4×9 = 36개의 값을 가질 것. 즉, 36차원의 벡터가 만들어짐. 이것이 HOG의 feature vector이다.
- feature vector는 이미지의 크기 , cell의 크기 , block의 크기 , bin의 개수에 따라 달라진다.
- 하나의 feature vector로 만든다???
- 모든 block에서 계산된 히스토그램을 하나의 feature vector로 만든다. 이것이 ml의 input data로 사용됨.
- 1. 기울기 계산
- 장점: 조명 변화에 강건함, 계산 효율적. 경계기반 특징을 사용하니 객체 검출 성능이 좋다.
- 단점: 복잡한 배경에 약함.
- 활용 : 사람 검출 , 얼굴 검출 , 객체 추적

- HOGDescriptor함수
- 객체( 특히 사람 )을 탐지하는데 사용되는 HOG를 구현한 클래스
- 이는 이미지의 특징을 추출하고, 이를 바탕으로 물체를 탐지함
cv2.HOGDescriptor
winSize 탐지 윈도우 크기
blockSize 윈도우를 나누는 블록의 크기. HOG 특징이 계산되는 기본 단위를 설정함
blockStride 블록을 이동시키는 간격. 블록 간 겹침을 조절함.
cellSize 블록을 구성하는 셀의 크기.
nbins 각 셀의 방향 히스토그램에서 사용하는 방향bin의 개수
derivAperture 경사도를 계산할때 사용하는 Sobel 필터의 커널 크기. default = 1
winSigma 가우시안 smoothing에 사용하는 표준편차. default = -1
L2HysThreshold 정규화 수행시 사용하는 임계값. default = 0.2
- compute함수
- 특징 이미지에 대해서 HOG 특징을 계산하는 함수