OpenCV를 활용한 이미지 유사도 비교 방법~
OpenCV는 인텔이 개발한 오픈소스 컴퓨터비전 C 라이브러리이다.
실시간 이미지 프로세싱을 위한 라이브러리로 윈도우, 리눅스 등 여러 플랫폼에서 활용할 수 있다.
원래 C 언어로 되어 있지만 최근에는 Java 언어로도 적용할 수 있고, 안드로이드 및 아이폰과 같은 모바일 환경도 지원한다.
다양한 이미지 프로세싱 알고리즘을 지원하기 때문에
처음에는 두 이미지가 동일한지 비교하는 메소드 같은 것이 존재할 줄 알았다.
그러나 두 이미지의 동일성을 OpenCV로 비교하는 것은 생각보다 쉽지 않았다.
히스토그램 비교, 템플릿 매칭, 피처 매칭의 세 가지 방법이 있다고 하는데
각각의 방법으로 구현한 다음 많은 테스트를 통해 실제 어느 정도 값이 나오면 일치한다고 판단할지를 정해야 한다.
이 부분은 다음 번 글에서 자바 기반의 소스와 함께 정리하면서 한번 더 논의해 보기로 한다.
OpenCV를 활용한 이미지 비교와 관련해 위에서 언급한 세 가지 기술에 대해 살펴보도록 하자.
Comparing histograms
히스토그램을 이용한 비교는 간단하면서 처리 속도가 빠른 방식으로 가장 오래된 방식이기도 하다.
이 방식은 숲 이미지는 녹색 계열로 되어 있고, 바다는 청색 계열로 되어 있을 것이라는 아이디어에서 출발한다.
그래서 숲과 관련된 두 장의 사진을 비교한다면, 두 이미지 모두 녹색을 많이 가지고 있기 때문에 히스토그램 사이에 유사성이 나타나게 된다.
하지만 이 방식을 사용할 경우, 바나나와 노란색으로 이루어진 벤치를 같은 이미지로 착각하는 오류를 일으킬 수 있다.
OpenCV 메소드는 compareHist()이며 C 언어 기반의 사용 예제는 여기를 참고하기 바란다.
매개변수에 따라 Correlation, Chi-square, Intersection, Bhattacharyya 형태의 결과값을 제공한다.
혹시 자바로 만든 예제를 원할 경우, OpenCV 이미지 유사도 비교 #1 - 피처 매칭 을 참고하기 바란다.
Template matching
템플릿 매칭은 큰 이미지에서 주어진 작은 이미지가 존재하는지를 검색하는데 주로 사용한다.
아래 그림처럼 작은 이미지의 강아지가 큰 이미지에서 있는 부분(우측의 빨간색 사각형 부분)을 찾을 때 효과적이다.
그러나 템플릿 매칭은 동일한 크기와 방향을 가진 똑같은 이미지를 가지고 검색할 때 좋은 결과가 나온다.
즉, 서로 다른 이미지가 얼마나 유사한지를 확인하는 것은 쉽지 않다.
OpenCV 메소드는 matchTemplate()이며, C 언어 기반의 사용 예제는 여기를 참고한다.
Feature matching
피처 매칭은 개인적으로 이미지 유사성 비교를 할 때 가장 효과적인 방식이라고 본다.
이미지로부터 수 많은 피처(feature)를 추출하는데, 해당 부분이 회전되거나, 확대/축소되거나, 찌그러져도 동일한 피처으로 인식하도록 보장한다.
이런 방식으로 추출된 피처들을 다른 이미지의 피처셋과 비교하면서 유사성을 검사하게 된다.
두 개의 이미지에서 추출한 피처들이 높은 비율로 일치한다면 동일한 또는 유사한 이미지로 볼 수 있다는 것이다.
그러나 세가지 방식 중 가장 속도가 느리고, 완전히 정확하지는 않다는 단점이 있다.
피처 매칭과 관련된 예제는 여기를 참고하면 된다.
실제 피처 매칭을 적용하려고 해도 결과값을 수치화해서 유사하다고 판단할 수 있는 범위를 산정해야 한다.
이를 위해서는 많은 테스트가 필요하지 않을까 한다.
마찬가지로 자바로 만든 예제를 원할 경우, OpenCV 이미지 유사도 비교 #2 - 히스토그램 비교 을 참고하기 바란다.
다음 글에서는 히스토그램과 피처 매칭을 자바로 구현한 다음 그 값의 범위를 정하는 것에 대해서 정리해 보려고 한다.
OpenCV 더보기..
OpenCV 이미지 유사도 비교 #2 - 히스토그램 비교