영상의 그래디언트 ( Gradient )
- 함수 f ( x , y )를 x축과 y축으로 각각 편미분 ( partial derivative ) 하여 벡터 형태로 표현한 것
영상이라는 것은 2차원의 평면이기때문에 미분을 할 때 x방향과 y 방향을 각각 따로 미분을 해줘야하는데
그렇게 되면 수식이 지저분해질 수 있기 때문에 묶어서 하나로 표현한 것을 Gradient 라고 한다.즉, x 방향의 미분값과 y 방향의 미분값을 묶어서 하나의 수로 표현하는 방법이다.
그래디언트 크기 :
그래디언트 방향 :
그럼 이 크기와 방향이 의미하는 것은 무엇인가?
실제 영상에서 구한 그래디언트 크기와 방향
- 그래디언트 크기 : 픽셀 값의 차이에 비례 , 픽셀값이 얼만큼 급격하게 변하고 있는지
- 그래디언트 방향 : 픽셀 값이 가장 급격하게 변화 ( 증가 ) 하는 방향
위 이미지를 참고하면 a 와 b의 배경색은 같고 내부 Gray Value 도 같다.
따라서 a 와 b의 Gradient 크기는 같다.
하지만 c를 보게되면 a , b 와 배경색은 같지만 내부 Gray Value 는 더 밝기 때문에
c는 a 와 b 보다는 Gradient 크기가 더 크다.
그리고 Grdient 방향은 급격히 증가하는 방향이기때문에 가장 밝은 내부로 빨간직선이 향하는 것을 볼 수 있다.
2D 벡터의 크기 계산 함수
cv2.magnitude ( x, y, magnitude ) -> magnitude ( dst )
x : 2D 벡터의 x 좌표 행렬. 실수형
y : 2D 벡터의 y 좌표 행렬. x와 같은 크기. 실수형
magnitude : 2D 벡터의 크기 행렬. x와 같은 크기, 같은 타입
cv2.phase ( x, y, angle, angleInDegrees ) -> angle ( dst )
x : 2D 벡터의 x 좌표 행렬. 실수형
y : 2D 벡터의 y 좌표 행렬. x와 같은 크기. 실수형
angle : 2D 벡터의 크기 행렬. x와 같은 크기, 같은 타입
angle ( I ) = atan2( y(I) , x(I) )
만약 x(I) = y(I) = 0 이면 angle은 0으로 설정됨
angleInDegrees : True이면 각도 단위, False 이면 래디언 단위
실제로 코딩을 구현해보면
src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
dx = cv2.Sobel(src, cv2.CV_32F, 1, 0)
dy = cv2.Sobel(src, cv2.CV_32F, 0, 1)
# 이전 강의에서 배웠던 Sobel 함수를 사용하여 x 와 y 의 미분값을 구해준 뒤
mag = cv2.magnitude(dx, dy)
mag = np.clip(mag, 0, 255).astype(np.uint8)
# magnitude 함수를 사용하여 x 와 y 의 미분값을 하나로 묶어주고 0 부터 255까지 Clip 해준다.
# 이후 영상에서 사용해야하기 때문에 uint8로 타입을 변환 시켜준다.
dst = np.zeros(src.shape[:2], np.uint8)
dst[mag > 120] = 255 # threshold(120) 역할
Sobel 필터에서의 dy 성분을 보게되면 위 기둥이 보이지 않던 현상을 볼 수 있었는데
magnitude 함수를 사용하여 dx , dy 성분을 묶은 값을 보면 기둥이 잘 표현되는 것을 볼 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 영상의 특징 추출 _ 허프변환 _ 직선 검출 (0) | 2022.06.01 |
---|---|
[Open CV] 영상의 특징 추출 _ 캐니 엣지 검출 (0) | 2022.05.31 |
[Open CV] 영상의 특징 추출 _ 영상의 미분과 소벨 필터 (0) | 2022.05.29 |
[Open CV] 기하학적 변환 _ 실전코딩 ( 문서 스캐너 ) (0) | 2022.05.28 |
[Open CV] 기하학적 변환 _ 리매핑 (0) | 2022.05.27 |