Image Gradients란?

- 정의: 각 픽셀에서 이웃 픽셀 간 변화량을 계산해, 변화 방향(orientation)과 크기(magnitude)를 추정
- 활용 예시:
- 에지 맵 생성(Edge Map)
- 객체 외곽선 추출(Contour Detection)
- 이미지 디스크립터 입력(예: HOG, SIFT)
1. 수동으로 그라디언트 계산하기
3×3 이웃 픽셀에서 중심 픽셀(빨간색)에 대한 상하좌우 픽셀을 다음과 같이 정의
- 수직 변화(G<sub>y</sub>) = South − North
- 수평 변화(G<sub>x</sub>) = East − West
- 그라디언트 크기: G = √(수평변화² + 수직변화²)
- 그라디언트 방향: θ = arctan2(수직변화, 수평변화) × (180/π)
2. Sobel & Scharr 필터
OpenCV는 이 연산을 빠르고 편리하게 수행하기 위해 Sobel 및 Scharr 커널을 제공함

- Sobel 필터
- 미분을 통해 픽셀 강도 변화(엣지)를 검출
- 수평, 수직 성분을 독립적으로 연산하여 대각선(±45도) 엣지에서는 정확도가 다소 떨어짐(회전불변성 부족)
- Scharr 필터
- 회전불변성, 정확도가 우수한 gradient값을 구하도록 설계됨.
- 3×3 커널(커널 사이즈 확장 불가) **연산에서 ksize=-1이면 scharr필터
- Sobel 대비 엣지 검출 정확도 향상, 단 연산 비용이 증가 & 훨씬 예민해서 노이즈가 많이낌
2-1. 언제 Sobel vs. Scharr를 사용할까?
| 상황 | 추천 필터 | 이유 |
| 일반적인 엣지 검출 | Sobel | 다양한 ksize 지원, 속도·유연성 우수 |
| 3×3 커널만 사용하면서 회전 불변성 필요 | Scharr | 작은 커널에서도 균일한 응답, 수치 정확도 높음 |
| 고해상도 이미지, 노이즈 심한 경우 | Sobel (큰 ksize) | ksize를 크게 하여 스무딩 강화, 노이즈 억제 |
| 화살표, 텍스트 윤곽 같이 특정 각도(45° 등) 강조 | Scharr | 45°·135° 엣지 응답 균일 |

2-2. 코드 예시
# [scarr] ksize = -1 | [sobel] ksize = 홀수(주로 3)
# x,y 방향 gradient 측정, 32비트 float
gX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=ksize)
gY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=ksize)
# [0,255] 범위의 8비트 int로 변환
gX = cv2.convertScaleAbs(gX)
gY = cv2.convertScaleAbs(gY)
# x,y gradient 합성
combined = cv2.addWeighted(gX, 0.5, gY, 0.5, 0)
3. Gradient magnitude / orientation
- Gradient magnitude(크기) : 주어진 픽셀에서 “얼마나 급격하게” 밝기나 색상이 변하는지
- 크기가 클수록 강한 에지
- 노이즈가 심하면 x축 / y축 gradient 중 한쪽이 크게 튀어 크기가 과대 평가될 수 있음
- Gradient orientation(방향) : 그래디언트가 변하는 방향 [-180, +180] or [0, 180]
3-1. JET 컬러맵으로 시각화
# x축과 y축을 따라 각각 기울기를 계산합니다.
gX = cv2.Sobel ( gray, cv2.CV_64F , 1 , 0 )
gY = cv2.Sobel ( gray, cv2.CV_64F , 0 , 1 )
# 그래디언트 크기와 방향을 계산합니다
크기 = np.sqrt ( ( gX ** 2 ) + ( gY ** 2 ))
방향 = np.arctan2 ( gY , gX ) * ( 180 /np.pi ) % 180
# 각 이미지를 플롯 & 출력
axs [ 0 ] .imshow ( gray, cmap = "gray " )
axs [ 1 ] .imshow ( 크기, cmap = "jet " )
axs [ 2 ] .imshow ( 방향, cmap = "jet " )
plt.tight_layout ( )
plt. show ()



- Gradient magnitude : 값이 클수록(엣지) 노랑,빨강값
- Gradient orientation : 0도(파란색), 180도(빨간색) 으로 표시됨
출처
Image Gradients with OpenCV (Sobel and Scharr) - PyImageSearch
In this tutorial, you will learn about image gradients and how to compute Sobel gradients and Scharr gradients using OpenCV’s “cv2.Sobel” function.
pyimagesearch.com
https://octave.sourceforge.io/octave/function/jet.html
Function Reference: jet
: map = jet () : map = jet (n) Create color colormap. This colormap ranges from dark blue through blue, cyan, green, yellow, red, to dark red. The argument n must be a scalar. If unspecified, the length of the current colormap, or 64, is used. See also: co
octave.sourceforge.io
'PyImageSearch' 카테고리의 다른 글
| OpenCV - Image Histograms (0) | 2025.06.15 |
|---|---|
| OpenCV - Edge detection (0) | 2025.06.14 |
| OpenCV - Thresholding(이진화) (0) | 2025.06.12 |
| OpenCV - Color Spaces (0) | 2025.06.12 |
| OpenCV - 블러처리 (2) | 2025.06.12 |