Computer Vision/opencv(python)

[35] 2) 그래디언트와 에지 검출

jwjwvison 2021. 3. 22. 11:11
  • 영상의 그래디언트 (gradient)
    • 함수 f(x,y)를 x축과 y축으로 각각 편미분하여 벡터 형태로 표현한 것

 

  • 실제 영상에서 구한 그래디언트 크기와 방향
    • 그래디언트 크기: 픽셀 값의 차이 정도, 변화량
    • 그래디언트 방향: 픽셀 값이 가장 급격하게 증가하는 방향

 

  • 2D 벡터의 크기 계산 함수
cv2.magnitude(x,y,magnitude=None) -> magnitude

 • x: 2D 벡터의x 좌표행렬. 실수형.
 • y: 2D 벡터의y 좌표행렬. x와같은크기.실수형.
 • magnitude: 2D 벡터의크기행렬. x와같은크기, 같은타입.

 

  • 2D 벡터의 방향 계산 함수
cv2.phase(x,y,angle=None,angleInDegrees=None) -> angle

 • x: 2D 벡터의x 좌표행렬. 실수형.
 • y: 2D 벡터의y 좌표행렬. x와같은크기.실수형.
 • angle: 2D 벡터의크기행렬. x와같은크기, 같은타입.

            angle(𝐼𝐼)=atan2(y𝐼𝐼,x𝐼𝐼)

            만약x(I)=y(I)=0이면angle은0으로설정됨.

 • angleInDegrees: True이면각도단위, False이면래디언단위.

 

  • 소벨 필터를 이용한 에지 검출 예제
import sys
import numpy as np
import cv2

src=cv2.imread('lenna.bmp',cv2.IMREAD_GRAYSCALE)
src=cv2.resize(src,(512,512))

if src is None:
    print('Image load failed!')
    sys.exit()

dx=cv2.Sobel(src,cv2.CV_32F,1,0)
dy=cv2.Sobel(src,cv2.CV_32F,0,1)

mag=cv2.magnitude(dx,dy)                 #255를 넘는 값들이 존재해서 하얗게 나옴
mag=np.clip(mag,0,255).astype(np.uint8)   #0~255 사이의 값으로 조정

dst=np.zeros(src.shape[:2],np.uint8)
dst[mag>80]=255                          

cv2.imshow('mag',mag)
cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()