2022.06.14 금일은 템플릿매칭 이해하기에 관한 강의였다.
템플릿 매칭 ( Template matching ) 이란?
- 입력 영상에서 ( 작은 크기의 ) 템플릿 영상과 일치하는 부분을 찾는 기법
- 템플릿 : 찾을 대상이 되는 작은 영상. 패치 ( Patch , Kernel )
이러한 템플릿 매칭이 동작하는 방식은 필터링에서의 동작방식과 상당히 유사하다
일단 템플릿 영상을 좌측 상단부터 시작해서 우측으로, 하단으로 전체스캔하면서 움직인다.
그렇게 유사도와 비유사도 나누게 된다.
그럼 실수형태의 행렬로 나오게되는데 이를 GrayScale 로 표현해서 볼 수 있다.
위와같이 유사도는 비슷한 부분을 밝게표시한것이고
비유사도는 비슷한 부분을 어둡게 표시했다고 볼 수 있다.
우측 유사도/비유사도 영상을 보게되면 가장자리가 검게 나타난것을 볼 수 있다.
이는 필터와는 조금 다른 부분인데
필터는 가장자리에 가상의 픽셀이 있다고 가정하고 커널을 돌리지만
템플릿 매칭은 가상의 픽셀은 없고 영상에 실제하는 좌측부터 우측하단까지의 픽셀을 스캔하기 때문에
검은 부분으로 나타난다.
실제로는 검은 부분은 표시되지 않고 내부의 유사도/비유사도 맵만 표시된다.
이후 위 유사도/ 비유사도 행렬에서 최댓값 / 최솟값을 선택하게되면 해당 부분이 가장 유사하다고 판단하여
해당 부분을 매칭시켜준다.
유사도 행렬에서는 최대값을, 비유사도 행렬에서는 최솟값을 선택하게된다.
템플릿 매칭 함수
cv2.matchTemplate ( image, templ, method, result, mask ) -> result
image : 입력 영상. 8비트 또는 32비트
templ : 템플릿 영상. image보다 같거나 작은 크기, 같은 타입
method : 비교 방법. cv2.TM_으로 시작하는 플래그 지정. ( 유사도 / 비유사도 )
TM_SQDIFF / TM_SQDIFF_NORMED : Sum of squared difference
TM_CCORR / TM_CCORR_NORMED : (Cross) Correlation
TM_CCOEFF / TM_CCOEFF_NORMED : Correlation Coefficient
result : 비교 결과 행렬. numpy.ndarray.dtype = numpy.float32
image의 크기가 W x H 이고, templ의 크기가 w x h 이면
result 크기는 ( W - w + 1 ) x ( H - h + 1 ).
플릿 매칭 방법 ( method ) 설명
cv2.TM_SQDIFF : Square Different - 같은 위치에 있는 픽셀끼리 뺄셈을 한뒤 제곱을 해서 모두 더한다.
그럼 가장 유사한 곳에서는 모두 더한 값이 0에 가까울 것이라고 판단
cv2.TM_SQDIFF_NORMED : 위 SQDIFF 를 정규화. 위 함수는 완전히 같으면 0, 다르면 값이 무한히 커지는데
이를 0과 1사이의 값으로 정규화한 인자
cv2.TM_CCORR : 같은 위치에 있는 픽셀값을 모두 곱하고 더하는 형태의 인자.
따라서 같으면 큰 값, 다르면 작은 값을 갖는다.
필터링에서 사용되는 방법과 완전히 동일하다.
cv2.CCORR_NORMED : SQDIFF_NORMED 와 같이 정규화한 인자.
CCORR_와 같은 방법이지만 0과 1 사이의 값으로 정규화하는 행렬의 값
cv2.TM_CCOEFF : 위의 CCORR 과 거의 유사한 수식을 갖고 있다.
복잡한 수식이지만 간단히 말하면 밝기에대한 보정을 진행한 후에 CCORR를 진행한다는 의미이다.
복잡한만큼 연산량이 더 많지만 그만큼 더 좋은 결과를 가질 수 있다.
cv2.TM_CCOEFF_NORMED : TM_CCOEFF 의 수식을 가지면서
완전히 일치하면 1, 역일치하면 -1, 상호 연관성이 없으면 0을 가지는 인자.
성능면에서 가장 많이 사용되는 방식이다.
실제 위 인자들을 사용하여 템플릿 매칭한 영상을 보게되면
각 인자의 특성을 바탕으로 하여 템플릿 매칭한 결과들이 빨간원으로 나오게되고
최대값 / 최소값을 가진 부분을 추출해낼 수 있다.
src와 같은 크기의 빈 Mat 변수를 만들고 가우시안 노이즈를 해당 영상에 추가해준다.
이후 입력영상에 빈크기의 Mat 변수 ( 가우시안 노이즈 추가된 ) 를 더해준다.
위 작업 이후 실제 템플릿 매칭을 진행하고 직접 확인할 수 있도록 GrayScale 로 변환시켜준다.
minMaxLoc 함수를 사용하여 최대값, 최대값의 위치를 따낸 뒤 Print 해준다.
실제로 실행해보게되면
위와같은 결과를 얻을 수 있다.
하지만 예를들어 위처럼 회로판 내부에서 crystal 이라는 템플릿을 스캔하여 찾을 수는 있지만
아예 연관이없는 이미지에서는 crystal 템플릿을 스캔하면 어떻게될까?
찾아내긴 할 것이다. 가장 밝은 값을 찾아내거나 가장 어두운 값을 찾아내서 그 부분을 추출해줄텐데
이를 방지하기 위해서는 maxvalue 에 제한을 두는 방법이 있다.
위와같이 회로판에서는 0.97이라는 높은 매칭률이 나오게되는데
위와같이 crystal을 물고기영상에 매칭 시켜도 찾긴했다.
하지만 이 영상의 매칭률을 보게되면
0.30이라는 낮은 매칭률이 형성되는 것을 볼 수있다.
따라서 MaxValue 값을 조절하여 일정 값 이하는 매칭이 안됐다고 처리해줄 필요성도 있어보인다.
0.7 이상을 성공적으로 매칭했다고 보는게 일반적이다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 영상 분할과 객체 검출 _ 캐스케이드 분류기 ( 얼굴검출 ) (0) | 2022.06.16 |
---|---|
[Open CV] 영상 분할과 객체 검출 _ 템플릿매칭 ( 인쇄체 숫자 인식 ) (0) | 2022.06.15 |
[Open CV] 영상 분할과 객체 검출 _ 모멘트 기반 객체 검출 (0) | 2022.06.13 |
[Open CV] 영상 분할과 객체 검출 _ 그랩컷 (0) | 2022.06.12 |
[Open CV] 이진 영상 처리 _ 다양한 외곽선 함수 (0) | 2022.06.11 |