본문 바로가기

PyImageSearch

OpenCV - Image Gradients(엣지검출)

Image Gradients란?

  • 정의: 각 픽셀에서 이웃 픽셀 간 변화량을 계산해, 변화 방향(orientation)과 크기(magnitude)를 추정
  • 활용 예시:
    • 에지 맵 생성(Edge Map)
    • 객체 외곽선 추출(Contour Detection)
    • 이미지 디스크립터 입력(예: HOG, SIFT)

 

1. 수동으로 그라디언트 계산하기

3×3 이웃 픽셀에서 중심 픽셀(빨간색)에 대한 상하좌우 픽셀을 다음과 같이 정의

North: I(x, y−1), South: I(x, y+1), East:  I(x+1, y), West:  I(x−1, y)
  • 수직 변화(G<sub>y</sub>) = South − North
  • 수평 변화(G<sub>x</sub>) = East − West
  • 그라디언트 크기: G = √(수평변화² + 수직변화²)
  • 그라디언트 방향: θ = arctan2(수직변화, 수평변화) × (180/π)

 

2. Sobel & Scharr 필터

OpenCV는 이 연산을 빠르고 편리하게 수행하기 위해 SobelScharr 커널을 제공함

  • 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° 엣지 응답 균일

(좌) Sobel 필터 (우) Scharr 필터

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 ()

 

Jet color map(0:blue, 255:Red)

 

JET 컬러맵

  • Gradient magnitude : 값이 클수록(엣지) 노랑,빨강값
  • Gradient orientation :  0도(파란색), 180도(빨간색) 으로 표시됨

 


출처

https://pyimagesearch.com/2021/05/12/image-gradients-with-opencv-sobel-and-scharr/?_ga=2.116104518.1773329974.1749613563-254784589.1749433426

 

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