이미지 패턴매칭을 구현하는 방법은 쉽지 않습니다. 사실 open cv를 활용하여 구현 할 수 있지만 단순히 opencv를 활용하여 구현하는데에는 한계가 있습니다. 상용 비전 라이브러리 정도의 패턴매칭을 구현하는 것을 목표로 한다면 이 기능을 구현하기에는 opencv만을 활용한다거나 여타 오픈소스로는 사실 어려움이 있습니다.
opencv를 활용하여 패턴매칭 기능을 구현한다면 단연 템플레이트 매칭 기법을 떠올릴 수 있습니다. 이 템플레이트 매칭 하나만을 가지고는 회전과 스케일 변환에 대한 구현을 해낸다는 것은 쉽지 않은 일입니다. 하지만 상용비전 라이브러리를 사용하지않고 빠른 처리 속도와 정확성을 얻으려고 한다면 어떻게 해야 하는 것인지 알기가 참으로 쉽지 않습니다. 인터넷을 아무리 검색해도 상용라이브러리 수준의 패턴 매칭을 어떻게 하는지 찾기가 사실 쉽지 않았습니다. 대부분은 단순히 템플레이트 매칭에 관한 내용이거나 특징점 추출에 대한 내용만을 찾을 수 있었습니다.
1. 특징점 추출 VS 템플레이트 매칭
opencv에도 다양한 특징점을 추출하여 이미지의 유사도를 측정하는 기법이 존재합니다. 이 방법은 회전과 스케일에 강하다는 장점이 있습니다. 하지만 한개의 이미지에서 다수의 특징점을 추출해내기에는 어려움이 있는 것 같았습니다. 템플레이트 매칭은 속도면에서 특징점 추출기법보다 훨씬 빠른 것으로 알려져 있습니다. 특징점 추출은 opencv에서 SURF, SIFT, ORB등 다양한 기법이 존재합니다. 하지만 중요한 사실은 대부분의 상용 라이브러리는 이미지 패턴 매칭을 구현하기 위해 특징점 추출 기법을 사용하지 않습니다. 대부분의 상용 라이브러리들은 저마다 약간씩의 차이는 있지만 결국 상관계수 알고리즘을 기반으로 이미지 패턴매칭 기법을 구현하고 있다고 생각됩니다.
2. 기하학적 패턴매칭
대부분의 상용 비전 라이브러리는 1990년대 초반에 이미 이미지의 조명에 따른 조건에 강건한 매칭 기법을 도입하기 위해 이미지의 기하학적인 부분만을 추출하여 매칭하는 방법을 채택했다고합니다. 이는 이미 수십년전에 벌써 개발된 기법이고 상용라이브러리에서 사용하고 있는 방법이라고 합니다.
3. 회전에 강건한 템플레이트 매칭?
템플레이트 매칭은 상관계수 알고리즘을 활용한 이미지 매칭기법이라고 합니다. 하지만 이 템플레이트 매칭은 회전한 이미지를 매칭하는 것은 쉽지 않다는 것이 문제 입니다. 10도 정도까지는 찾아낼 수 있지만 매칭율이 상당히 떨어진다고 합니다. 이미지 회전 매칭을 위해서는 당연히 이미지의 크기가 작은 템플레이트 이미지를 회전하여 이미지 검색에 적용합니다. 이때 이미지를 회전하게 되면 불필요한 부분이 발생하게 됩니다. 이런 부분들은 자동으로 마스킹처리를 해야 합니다. 아래 이미지 처럼 왼쪽의 원본 이미지에서 약 45도 회전을 하게 되면 필연적으로 붉은색으로 표시된 영역이 발생합니다. 이런 부분은 템플레이트 매칭에 영향을 주지 않도록 마스킹 처리를 해야 합니다.
대부분의 상용프로그램은 이러한 부분을 자동으로 처리해 줍니다.
4. 이미지 처리 속도에 대한 해결책
사실 템플레이트 매칭만으로 이미지 매칭을 시킨다면 대략 5M짜리 해상도를 가지는 이미지에서 45도로 회전한 이미지를 찾는다면 물론 쉽게 1도씩 회전 시켜가며 템플레이트 매칭해 나가는 것을 생각해 볼 수 있습니다. 저도 이 단순한 방법으로 구현을 해본 결과 이미지를 매칭하는 것은 둘째 문제이고 수행 시간이 엄청나게 오래 걸린다는 것을 알았습니다.
대략 5M짜리 이미지에서 실행을 한다면 한번 실행하는데 1분이 넘게 걸리는 것을 확인했습니다.
따라서 이런 단순한 방법은 불가능하며 이미지를 축소하여 이미지 피라미드를 이용해야 한다는 것을 알게 되었습니다.
아래는 이미지 피라미드를 활용하여 최상위의 가장 작은 이미지에서 먼저 이미지를 검색한 후 다음 단계로 하나씩 정밀하게 찾아나가는 기법을 활용합니다. 이러한 방식은 최상위 단계에서 대략적인 정보를 얻은 후 단계를 내려갈 수록 불필요한 부분을 배제하여 검사 함으로써 시간을 단축시키는 효과를 볼 수 있습니다.
5. 상용라이브러리 수준의 패턴 매칭을 하기위한 방법론
대부분의 상용 프로그램은 이미지의 검색을 위해 다양한 옵션이 있습니다. 회전, 스케일, 기하학적 형태의 변환을 위해 어느 수준까지 이미지에 변환을 줄것인지에 대한 설정이 가능합니다. 특히 회전과 스케일은 영역을 어디까지 설정할 것인지에 대한 것도 가능합니다. 대부분의 상용 비전 라이브러리는 상당히 빠른 시간에 정확하게 이미지의 위치를 검색하여 찾아줍니다. 5M 수준의 이미지에서도 어떻게 설정을 한다고해도 결코 100ms를 넘기는 경우는 없었던것 같습니다.
- 이미지 피라미드를 활용하여 단계별로 축소된 이미지를 형성하여 가장 작은 이미지에서 제일먼저 매칭을 수행 합니다. 가장 작은영역에서 매칭을 수행하여 가능이 있는 모든 영역을 찾아줍니다. 이미지를 축소한 상태에서 찾기 때문에 수행 시간이 매우 빨라 집니다. 이때 대략적인 이미지의 위치와 각도를 획득합니다.
- 이미지는 템플레이트 매칭을 위해 기하학적인 부분만을 추출해 내는 작업을 합니다. 최대한 불필요한 노이즈를 줄이고 이미지의 외곽 테두리만을 구하기 위해 템플레이트 이미지와 입력 이미지 모두에 케니엣지를 적용하여 변환 합니다.
- 템플레이트 이미지를 회전하여 회전된 이미지에 대한 검색을 수행 합니다. 이부분은 선택이 가능하게 하여 원하는 각도를 모두 검색하되 몇도씩 회전하여 검색할지는 선택해야하는 부분입니다.
- 가장 작은 이미지에서 찾은 영역의 부분만을 검사합니다. 전체 이미지를 검사하지 않습니다. 이렇게 유력한 부분만 재검사를 수행합니다. 좀더 세밀하게 찾아들어가는 작업을 합니다. 각도의 경우 이미 어느 정도 각도를 최상위 단계에서 수행 했기때문에 조금더 정밀하게 찾아가는 작업을 수행합니다. 이러한 기법은 불필요한 영역에 대한 부분을 배제함으로써 최대한 시간을 단축시키기 위함 입니다.
- 이러한 단계로 최하위 이미지 피라미드 단계까지 탐색을 수행 합니다.
다음에는 이러한 구현을 위해서 실제 코드를 활용하여 구현을 해보도록 하겠습니다.
'영상처리' 카테고리의 다른 글
엣지 기반 이미지 패턴매칭(Edge based pattern matching) 프로그램 기법 소개(OpenCV 활용) (0) | 2022.04.17 |
---|---|
opencv를 활용한 이미지 외곽선 검출 FindContours 함수 활용 (0) | 2022.02.17 |
opencv를 활용한 이미지 회전(GetRotationMatrix2D 함수 활용) (0) | 2022.02.15 |
OpenCvShap 프로젝트 만들기(C# 활용) (0) | 2021.02.02 |
OpenCV 이진화 처리 프로그램 (0) | 2020.08.12 |
댓글