엣지 : 어떤 물체의 윤곽선 혹은 경계선
엣지 검출 => 객체의 크기, 위치, 모양 인식
화소값이 급격하게 변하는 부분
엣지를 검출하는 방법
- 1차 미분 마스크
- 2차 미분 마스크
1차 미분 마스크
화소가 급격하게 변하는 부분 => 함수의 변화율 계산 ( 미분 )
디지털 영상은 연속적인 데이터가 아닌 이진 데이터기 때문에 기울기를 근사화해서 계산한다.
2차원 공간상의 한 화소에서 수평, 수직방향으로 미분 ( 편미분 )
편미분을 한 화소 단위(dx = 1, dy = 1) 로 함
각 방향의 차분을 이용해서 기울기의 크기를 구한다. ==> 엣지의 강도
아크 탄젠트 함수에 가로와 세로의 차분을 적용하면 엣지의 방향
==> 1차 미분 마스크를 회선( convolution ) 적용
마스크 계수의 합은 0이 되아야한다.
1. 로버츠 마스크
대각선 방향으로 -1과 1을 배치
매우 단순
경계가 확실한 엣지만 추출, 잡음에 민감
대각선 엣지가 잘 추출됨
img1 = cv2.imread("rob.PNG",cv2.IMREAD_COLOR) img1_g = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) mask1 = np.zeros((3,3)) mask2 = np.zeros((3,3)) mask1[1,1] = 1 mask1[0,2] = -1 mask2[1,1] = 1 mask2[0,0] = -1 m1 = cv2.filter2D(img1_g,cv2.CV_32F,mask1) m2 = cv2.filter2D(img1_g,cv2.CV_32F,mask2) scr = cv2.magnitude(m1, m2) scr = np.clip(scr,0,255).astype(np.uint8) cv2.imshow("rob",scr) cv2.imshow("origin",img1) cv2.waitKey(0) cv2.destroyAllWindows()
이미지 출처 위키백과 콜로세움
작은 부분들은 뭉게짐
2. 프리윗 마스크
로버츠 마스크의 단점을 보완하기 위해 만들어진 마스크
x방향으로 3번 차분(수평), y방향으로 3번 차분(수직)
세 번의 차분을 합하기 때문에 로버트 마스크보다 엣지 강도가 강하고 수평, 수직 엣지에 강하다.
이미지 출처 위키백과 콜로세움
img2_g = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) mask1 = np.zeros((3,3)) mask2 = np.zeros((3,3)) mask1[0:3,0] = -1 mask1[0:3,2] = 1 mask2[0,0:3] = -1 mask2[2,0:3] = 1 m1 = cv2.filter2D(img2_g,cv2.CV_32F,mask1) m2 = cv2.filter2D(img2_g,cv2.CV_32F,mask2) scr = cv2.magnitude(m1, m2) scr = np.clip(scr,0,255).astype(np.uint8) cv2.imshow("prew",scr) cv2.imshow("origin",img2) cv2.waitKey(0) cv2.destroyAllWindows()
로버츠 마스크보다 엣지의 강도가 강하다.
3. 소벨 마스크
엣지 추출을 위한 가장 대표적인 1차 미분 연산자이다.
중심 계수의 차분에 대한 비중을 2배로 키운 것이 특징
수직, 수평, 대각선 엣지 검출에 효과가 좋다.
img2_g = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) m1 = cv2.Sobel(img2_g,cv2.CV_32F,1,0) m2 = cv2.Sobel(img2_g,cv2.CV_32F,0,1) scr = cv2.magnitude(m1, m2) scr = np.clip(scr,0,255).astype(np.uint8) cv2.imshow("prew",scr) cv2.imshow("origin",img2) cv2.waitKey(0) cv2.destroyAllWindows()
이미지 출처 위키백과 콜로세움
미세한 엣지까지 검출되는 것 보임