영상처리 도구에 설명된 OpenCV Template Matching 활용 시 선택할 수 있는 “Method”에 대한 추가 설명입니다. 아래 그림에서처럼 총 6가지 수식 중 하나를 사용할 수 있게 되어 있고, “Method” 중에 _NORMED 표시는 정규화 Normalization에 약자 정도로 보면 됩니다. 수학적 접근에 기반하여 각 수식들은 두 영상 간 같은지 또는 다른지 정도를 거리 Distance로 정의하고 있고 간단한 수식(1)에서부터 복잡한(6) 수식으로 표현하고 있습니다.

 

 

 

위 수식들에서 T Template, ISource Image로 보고, 실제 동작으로 I를 기준으로 T를 움직이면서 픽셀 Pixel 간 처리를 통해 Matching 정도를 분석하게 됩니다.

 

Method 1. CV_TM_SQDIFF은 차이값의 제곱합 Square Sum of Difference을 의미하고 수식에서처럼 픽셀 간 차이가 거리가 되며 결론적으로 가장 작은 값을 갖는 위치가 Matching 위치로 볼 수 있습니다.

Method 3. CV_TM_CCORR은 상관관계 Cross Correlation을 의미하고 픽셀 간 곱의 전체 합으로 Template 간 거리 정도를 나타내며 최종 가장 큰 값을 갖는 위치가 Matching 위치가 됩니다.

Method 5. CV_TM_CCOEFF는 상관계수 Cross Correlation Coefficient로 표현되고 위 방법들과 다르게 Template Source 에 픽셀 평균 Mean값을 제외한 곱에 전체 합을 거리로 나타내며 특징지도 Feature Map에 가장 큰 값을 갖는 위치가 Matching 위치가 됩니다.

 

Method 1 2와 다르게 수식(5)는 평균값이 추가되어 조금 복잡해졌죠. 일반적으로 수식이 복잡해지면 조금 더 외부요인에 강건해지는 효과가 있습니다. 실무에서 영상정합 시 잡음이나 밝기 변화 등에 외부요인을 고려해야 하고 수식(5) 상관계수는 영상 간 선형적 밝기 변화에 수식(1) (2)보다 강건한 효과가 있습니다. 더 나아가 _NORMED이 붙는 정규화 함수가 추가되면 Matching 성능이 더욱 향상됩니다.

 

정규화 관련해서는 위 수식에서처럼 Pearson correlation coefficient를 통해 통계학 Statistics적으로 유도해 볼 수 있습니다. 실무에서 패턴 정합은 많은 외부요인들을 고려해야 하며 OpenCV에 제공되는 방법 외에도 다양한 방법들이 존재합니다. 위 방법들에 기본 원리를 잘 이해하면 실무에서 응용하는데 상당한 도움이 될 수 있습니다.

물체 추적 Object Tracking 분야에서 주요하게 사용되는 기술이 Pattern Matching 기술 입니다. 물체 추적이라는 단어에서 느껴지는 것처럼 실시간 영상처리에 한 분야 입니다. 보안 및 감시 카메라에서 출력되는 연속 영상 또는 동영상 처리 정도로 이해하면 됩니다. 알고리즘 구현에서는 크게 물체 탐색과 추적으로 나뉘고, 예를 들어 물체가 자동차라면 첫 영상에서 자동차를 추출하고 자동차 영역을 이용하여 다음 영상에 차량 위치를 탐색하고자 할 때 사용되는 기술이 Pattern Matching에 응용 입니다.

OpenCV 라이브러리에서는 Pattern Matching 함수를 제공하고 있습니다. 아래 그림에서처럼 Pattern(Template) 영상과 원본영상 Input Image 만 있으면 테스트를 해 볼 수 있고 이를 통해 다양한 실무 응용분야를 찾을 수 있습니다. 결과에서 Feature Map을 볼 수 있는데 Matching에 최종 결과로 볼 수 있고, Feature Map에 가장 높은 Pixel 값에 위치가 Template과 가장 유사한 영역으로 생각할 수 있습니다.

 

 

위 함수를 보면 C/C++ Python 언어로도 사용할 수 있게 제공되고 있습니다. 함수 사용시 입력 변수들 중 “Method” Matching에 사용되는 수식이라고 보면 되며 실제 다양한 수학적 접근 방법들이 사용되고 있습니다. OpenCV에서는 여섯 가지 방법들을 제공하고 있습니다. 그 중에 하나가 아래 사용 예에 “CV_TM_SQDIFF”가 있는데 Pixel 간 차이 제곱에 총합 Sum of Square Difference을 의미합니다. 수학적 방법에 상세한 내용은 영상처리기술에서 기술하도록 하겠습니다.

 

Template Matching 사용 예)

C: void cvMatchTemplate( Input_Image, Template, Feature_Map, CV_TM_SQDIFF )

 

cvMatchTemplate 함수 수행 후에 최종 결과인 Feature Map에서 최대값에 위치를 찾을 때 손수 코딩을 통해 찾을 수 있지만 OpenCV 함수에 하나인 cvMinMaxLoc을 사용할 수 있습니다. 이 함수를 이용하면 최대 및 최소값과 영상에서 그 위치를 추출할 수 있습니다.

실무에서는 Pattern Matching 기술 개발 시 OpenCV에서 사용되는 General Method도 사용할 수 있지만 물체에 특성에 맞게 Feature를 정의해서 직접 알고리즘을 구현하여 적용할 때도 있습니다. 하지만 기존 방법들의 답습을 통해 장단점을 파악하는 것도 자신만에 기술을 고도화 시킬 수 있는 방법이기도 하겠죠.

 

영상에 타원 형태에 물체를 찾고자 할 때 영상처리를 통해 외곽선을 추출하게 됩니다. 보통 에지탐색(Edge Detection) 기법들을 통해 외곽선을 탐색하게 되는데 주변 PixelIntensity 차이를 이용하는 (수학적으로 미분/Differential Equation 이라고 합니다.) 이러한 기법들은 영상의 화질 특성에 의해 완전한 외곽선이 아닌 끊겨 있거나 파편적인 선으로 추출되는 경우가 많습니다. 이 때 끊겨 있는 선들의 정보를 활용하여 타원을 추정할 때, OpenCV Ellipse Fitting 함수를 이용할 수 있습니다.

 

 

그림에서와 같이 fitEllipse 함수에 입력인 “points”은 영상에서 외곽선에 좌표를 의미합니다. C/C++ 함수의 출력인 “RotatedRect/CvBox2D”는 구조체로 중심좌표 Center, 크기 Size, 기울어진 각도 Angle 정보를 담고 있습니다. 타원 추정 결과를 확인 할 때는 앞에서 기술한 기본 그리기 함수인 아래 cvEllipse를 이용하면 됩니다. 입력 변수 중 “start_angle/end_angle”은 그려줄 각도를 나타내고 전체를 표시하고 싶으면 “start_angle = 0/end_angle = 360”으로 설정할 수 있습니다. 0~180으로 설정하면 타원에 반만 그려 주겠죠.

 

타원 그리기 함수 예)

C: void cvEllipse(CvArr* img, CvPoint center, CvSize axes, double angle,

     double start_angle, double end_angle,

     CvScalar color, int thickness=1, int line_type=8, int shift=0 )

 

실제 산업분야에서 타원이나 원을 추출할 때 다양하게 응용되고 있고 활용범위가 넓습니다. 타원 추정 이론과 함께 알아 두시면 많은 도움이 될 수 있습니다. OpenCV에 구현된 함수는 “A Buyer’s Guide to Conic Fitting”을 기반으로 하고 있습니다.

영상처리 오픈 라이브러리인 OpenCV를 사용하려면 기본적인 구조와 이용 방법을 알아야 합니다. 이번 이야기에서는 OpenCV 활용을 위해 가장 기본 함수 중 하나인 Line’에 대해 알아 보겠습니다. 단어에서처럼 한 점에서 다른 한 점까지 선을 긋는 함수이고 OpenCV 홈페이지에도 설명이 잘 되어 있습니다. 초기에는 C/C++ 언어만 제공되었는데 현재에는 Python에서도 활용될 수 있게 기능을 제공하고 있네요.

 

 

함수에 첫 번째 “img”는 선을 그릴 영상, “pt1 / pt2”는 선에 시작 점과 끝나는 점을, “color”는 선에 색깔을 나타냅니다. “thickness”는 선의 두께, “line type” 4, 8, CV_AA 중 하나를 선택할 수 있는데 선을 표현하는 거칠기 정도로 이해하면 됩니다. C 또는 C++ 함수를 사용 시 “img” 앞에 구조체 형이 다르기 때문에 주의해서 사용해야 되고 C 함수에서는 보통 “IplImage” 구조체를 사용합니다.

 

사용 예)

cvLine( Input_Image, cvPoint(10,10), cvPoint(100,100), CV_RGB(255, 255, 255), 1, CV_AA, 0);

 

C 함수 이용 시 위 예에서 처럼 활용할 수 있습니다. 설명했듯이 “Input_Image” IplImage 구조체이며 “pt1 / pt2” cvPoint(x, y)“color” CV_RGB(red, green, blue)로 대입 할 수 있습니다. CvPointOpenCV 사용에 맞게 정의된 구조체로 볼 수 있습니다. 몇 번 실습을 해보면 쉽게 익힐 수 있고, Line 함수를 활용할 수 있으면 Circle, Rectangle, Ellipse OpenCV에서 제공되는 기본 함수들을 쉽게 이용할 수 있게 됩니다.

경험 상 함수에 사용법은 개인 블로그 등을 참조하는 것보다 그 라이브러리 설명서를 이용하여 익히는 것이 가장 정확한 방법인 듯 합니다. 기본 함수를 잘 익히면 유사한 함수들은 쉽게 익힐 수 있고 응용이 가능해 질 수 있습니다.

C 언어는 1970년 초 벨 연구소(Bell Lab.)에서 유닉스 시스템의 운영체제를 만들기 위해 개발된 프로그래밍 언어 입니다. 역사가 오래되기도 했지만 현재까지 폭넓게 사용되는 언어이기도 합니다. C++ C에 확장판으로 객체지향 프로그래밍을 지원하기 위해 개발된 언어이며, C#은 마이크로 소프트사(Microsoft)에서 C++ 언어를 기반으로 닷넷 프레임워크(.NET Framework)의 응용 프로그램 개발을 위한 언어 입니다. 유사한 성격에 JAVA 언어 진영에 대응하기 위한 목적도 있다고 하죠.

 

C 프로그래밍 언어에 역사에서처럼 C 프로그래밍 문법을 잘 알면 C#까지 익히는데 많은 시간이 필요하지 않습니다. 프로그래밍 언어 습득은 전공과도 연관성이 있겠지만 업무와도 사용에 지속성에서 상당한 연관이 있습니다. 외국어를 습득하는 과정처럼 사용하면 사용할수록 느는 게 프로그래밍 언어도 같습니다.

 

 

프로그래밍 기술에서는 C 언어에 문법을 기본적으로 알고 있다는 가정하에 영상처리 기술들을 확인해보고 검증해보는 도구로 마이크로 소프트사의 Visual Studio에 포함된 MFC(Microsoft Foundation Classes)를 사용할 예정이고 간혹 C#에 대한 이야기도 할 예정입니다. 개발 환경 설치나 기본적인 내용들은 많은 블로그에 잘 나와 있으니 프로그래밍 이야기에서는 다양한 프로젝트들을 진행하면서 문제 해결이나 유용하게 사용했던 코드들에 대한 이야기를 해 볼까 합니다.

(See below for English version.)  

영상처리 기술을 살아있는 기술로 만들기 위해서는 영상처리에 기본적인 지식과 프로그래밍 언어를 이용한 기술 구현능력이 필요합니다. 예를 들면 영상에서 꽃만 추출하고 싶다고 할 때 잡음 제거(Noise Reduction)를 위한 필터링(Filtering), 모양을 확인하기 위한 윤곽선 추출(Edge Detection), 크기 및 위치 정보 확인을 위한 연결성분 해석(Connected Component Analysis) 등등에 알고리즘이 필요합니다. 이 때 각 기능들을 하나씩 구현하고 검증하는 과정이 필요한데 상황에 따라 많은 시간을 필요로 하게 됩니다. 따라서 기본적인 알고리즘들이 기능으로 만들어져 있다면 개발 시간을 줄일 수 있을 뿐만 아니라 다양한 시험들을 해 볼 수 있을 겁니다. 이럴 때 주요하게 사용되는 것이 영상처리 라이브러리 입니다.

 

 

영상처리 라이브러리는 다양하게 존재합니다. 크게 유료와 무료로 구분되고 프로그래밍 언어 별로 최적화 되어 있습니다. MATLAB, MIL(Matrox Imaging Library), Cognex, Euresys 등에 유료 라이브러리 등이 있으며, OpenCV, ImageJ, PIL(Python Imaging Library) 등은 무료로 사용할 수 있는 라이브러리 들입니다. 개인적인 경험 상 활용도 측면에서 OpenCV MATLAB이 대표적으로 사용되는 유무료 라이브러리가 아닐까 생각됩니다. 산업적으로도 개발부분에 상당히 많이 활용되고 있어 프로그래밍 언어와 함께 라이브러리 쓰임새를 정확이 알아두면 영상처리 분야에 상당한 경쟁력이 될 수 있습니다.

 

영상처리 도구(Image Processing Tool) 이야기에서는 OpenCV(Open Source Computer Vision) 사용법에 대해 기술해 나갈 예정입니다. OpenCV는 실시간 영상처리를 위해 인텔(Intel)에서 개발되었고 인텔 CPU C/C++ 프로그래밍 언어에 최적화 되어 있습니다. 2000년 중 후반부터 활성화 되어 현재 버전 3.0 이상까지 나와 있습니다. 라이브러리는 사용하기 쉽게 영상처리 기능들을 모아둔 것이기 때문에 응용을 위해서는 각 기능에 본질적인 원리 등을 정확히 파악하면서 사용하는 것이 실력과 경쟁력 향상에 시작일 수 있습니다.

 

For the development of image processing application, we need the basic knowledge and algorithm design ability for image processing. For example, if you want to detect the flower in an image, you can use the noise reduction filter, edge detector for shape feature and connected component analysis algorithm to find a flower position. In this case, the functions need to be implemented and verified one by one and these steps can take a lot of time. Therefore, if the basic algorithms are built as functions, we will not only reduce the development time, but try various tests. At this time, image processing library is mainly used. In the industry, image processing libraries are widely used and there are libraries such as Matlab, MIL, Cognex, Euresys, OpenCV, etc. In my experience, OpenCV and Matlab are probably the most popular and OpenCV is free to use library. In this blog, OpenCV usage will be explained. OpenCV was developed by Intel for real-time image processing and is optimized for Intel CPU and C/C++ programming language. And it has been develop since the mid 2000’s and is now available in version 3.0 and above. If you understand the principles of using OpenCV functions through this blog, your algorithm implementation skills and technical competitiveness will be improved.

   프로그래밍은 컴퓨터가 이해할 수 있는 언어로 목적에 따라 동작 할 수 있게 구체화 시켜주는 작업을 의미합니다. 그 작업을 코딩(Coding)이라 부르며 더 나아가 컴퓨터 프로그램, 소프트웨어 또는 알고리즘 등에 구현을 의미하기도 합니다. 대부분에 전자기기에는 목적에 따라 작고 큰 소프트웨어가 담겨져 있습니다. 그 소프트웨어에 포함된 알고리즘들에 따라 특정 동작을 하게 되어 있으며 예를 들어 스마트폰에 각 기능별 아이콘을 터치하면 목적에 맞게 동작하는 것도 소프트웨어 기술이라 하겠습니다. 영상처리 기술들도 컴퓨터 프로그램과 매우 밀접하며 프로그래밍 언어를 통해 하나에 알고리즘으로 구현될 수 있습니다.

   컴퓨터가 알아들을 수 있는 프로그래밍 언어는 어떤 것들이 있을까요? 실제 사용되는 언어들은 수십 종류 이상일 듯 합니다. 아래는 세계적으로 사용되고 있는 프로그래밍 언어 중 가장 빈도수가 높은 것부터 순서대로 표시한 목록입니다.

 

 

 

   한번씩 들어본 언어도 있을 테고 사용을 해봐서 익숙한 언어도 있겠죠. 제 경우는 C/C++/C# MATLAB 언어에 익숙하고 앞으로 프로그래밍 이야기에서는 C 계열 언어를 기준으로 기술해 나 갈 예정입니다. 모든 언어를 잘 다루기는 어려울 수도 있습니다. 다만 자신에게 필요한 언어 중 하나만 정확하게 사용할 수 있다면 다른 언어를 배우고 응용 할때 상당한 도움이 될 수 있습니다.

영상처리 시스템 또는 컴퓨터 비젼 시스템(Computer Vision System)은 영상처리기술이 적용될 수 있는 영상획득부터 정보에 출력까지 전체를 포함하는 시스템을 의미합니다. 영상처리 시스템에 이해는 우리가 만들고자 하는 영상처리기술이 어떻게 응용이 되고 실무에 적용이 되는지 알 수 있고, 상세하게는 아니겠지만 어떻게 사용할 지 유추하기 위함입니다.

 

 

산업 전반에 사용되고 있는 영상처리 시스템을 단순화 시켜 보면 크게 세 부분으로 나뉘어지는데 첫 단계는 사람에 눈에 역할을 하는 센서에서 영상을 획득하고, 두 번째 단계에선 획득된 영상을 이용하여 프로세서에 의해 목적에 따라 영상처리를 하며, 마지막 단계에서 처리된 정보를 사용 또는 보여주는 과정으로 진행됩니다. 그림에서처럼 센서는 카메라, 프로세서는 컴퓨터 그리고 정보에 사용은 모니터 정도로 생각할 수 있습니다.

 

(See below for English version.) 

영상처리라는 기술 또는 학문을 어떻게 정의할 수 있을까요? 위키피디아(WIKIPEDIA)에서는 정지영상 또는 동영상을 입력으로 하고 신호처리에 한 부분으로 수학적 연산을 이용한 영상의 처리를 의미하며 결과물로는 하나에 영상 또는 영상에 관계된 특징에 집합이 될 수 있다라고 정의하고 있습니다. 다시 설명 하면 인간에 눈으로 보여지는 부분을 영상이라고 한다면 자동차가 어느 방향으로 움직이고 있는지 아래 그림에서처럼 꽃이 몇 개인지 등에 영상에서 필요로 하는 정보라면 이를 특징이라고 정의할 수 있고 이러한 특징들을 시각적 또는 수치적으로 구현해주는 제반 기술을 영상처리라고 말할 수 있습니다.

 

 

 

영상처리 기술들은 산업, 의료, 항공, 교통, 애니메이션 등 다양한 분야에 폭넓게 응용되고 있습니다. 제조 산업에 경우 영상을 이용한 자동화 검사에 주요하게 적용되고 있으며 의료분야에서도 PET, X-Ray, CT 영상 등에 처리를 통해 의학적 검사에 도움을 주고 있습니다. 더 나아가 3차원 가상 현실을 그려내는 그래픽 분야에서도 응용되며 빅 데이터 처리에 정보 추출을 위한 Deep Learning 분야에 연계하여 특징 추출에 사용되고 있습니다.

 

서두 정의에서 같이 일반적으로 영상처리는 디지털 신호에 대한 처리를 의미하며 영상이라는 2차원 공간에 디지털 신호 처리를 말합니다. 디지털 신호는 어떻게 정의할 수 있을까요? 실세계에 신호들을 아날로그 신호로 본다면 샘플링이라는 과정을 통해 디지털 형태로 변환된 신호로 볼 수 있습니다. 아날로그 신호를 연속된 하나에 선이라면 디지털 신호는 일정 시간 간격으로 선에서 떼어낸 점들에 집합이라고 생각할 수 있습니다. 다만 영상은 평면에 점들이 모였으니 2차원 디지털 신호라고 볼 수 있습니다.

 

영상처리에 필요한 기본지식들은 좋은 참고 서적들이 나와있고 수많은 강좌 블로그들을 통해 쉽게 습득할 수 있습니다. 따라서 본 영상처리 이야기에서는 자유롭게 난이도에 관계없이 기술과 응용 주제등 필요에 따라 내용을 연재해 나 갈 예정입니다.

 

How can we explain “Image processing technology”? WIKIPEDIA(KOR) descript “Image processing is a part of signal processing and means the processing of still or successive images using mathematical operation and the result can be a set of features related to the image”. In other words, the features are the information such as the direction of moving car and a number of flowers in above fig.

 

Image processing application has various areas such as industry, medical imaging, security, transportation, satellite, etc. Further, we can apply 3D graphics and machine learning for the big data analysis. Technically, Image processing means the processing of digital signal in 2D space. Digital signal can be representing by a sequence of digit values differently from Analog signal by continuous values.

 

We can easily find basic knowledge and information of image processing technologies through books and the other web sites. This blog will focus on some topics such as the algorithm, programming and library.

 

 

+ Recent posts