칼라 분석 처리 목적에 따라 RGB 공간에서 다른 공간으로 변환할 있습니다. OpenCV에서 cvtColor 함수를 사용할 있으며 RGB 공간에서 변환할 경우에는 채널의 순서를 명시적으로 지정해야 합니다. OpenCV 기본 형식은 RGB라고 하는 경우가 많지만 실제로는 BGR입니다. 24비트 이미지의 번째 바이트는 8비트 Blue 성분이고 번째 바이트는 Green, 번째 바이트는 Red 됩니다.

 

아래는 C언어와 Python 활용 따른 예이며 src는 원본, dst는 결과입니다. cvtColor 함수를 활용하면 간단히 색 공간변환을 할 수 있습니다.

 

(C언어): cvtColor(src, dst, cv::COLOR_RGB2GRAY);

(Python): dst = cv.cvtColor(src, cv.COLOR_RGB2GRAY)

 

Luv 같은 비선형 변환은 입력 RGB 영상을 적절한 범위로 정규화하여 처리해야 합니다. 예를 들어 8비트 영상에서 직접 변환된 32비트 부동소수점 영상이 있으면 함수에서 가정하는 0.1 아니라 0.255 범위를 갖게 됩니다. 따라서 cvtColor 호출하기 전에 아래 예와 같이 먼저 영상을 축소해야 합니다.

 

src *= 1./255;

cvtColor(src, dst, COLOR_BGR2Luv);

 

아래는 RGB 공간에서 수식적 변환 관계(Gray, HSV, HLS, Lab)이며  cvtColor의 변환 코드 선택으로 간편히 변환할 수 있습니다. cv::COLOR_RGB2HSV (또는 cv::COLOR_BGR2HSV) 등.

RGB to GRAY 변환

RGB to Gray: Y = 0.299⋅R+0.587⋅G+0.114⋅B

 

RGB to HSV 변환 (Hue, Saturation, Value)

R, G, B 부동 소수점 형식으로 변환하여 [0~1] 범위에 맞게 스케일링 계산 적용합니다.

 

RGB to HLS 변환 (Hue, Luminance, Saturation)

R, G, B 부동 소수점 형식으로 변환하여 [0~1] 범위에 맞게 스케일링  계산 적용합니다.

 

RGB to Lab 변환

R, G, B 부동 소수점 형식으로 변환하여 [0~1] 범위에 맞게 스케일링  계산 적용합니다.

(docs.opencv.org 참조)

(docs.opencv.org 참조)

영상처리의 가장 기본이 되는 연산 중에는 픽셀 Pixel 연산과 마스크 Mask 연산이 있습니다. 현 블로그에서는 픽셀 간 산술 연산 Arithmetic Operation과 그 응용인 이미지 혼합 Image Blending을 간략히 다루겠습니다. 아래 예에서는 파이썬 코드로 설명하지만 당연히 C언어 함수로도 제공됩니다.

 

이미지 덧셈 Image Addition

덧셈 함수는 cv.add(input1, input2)로 사용할 수 있으며, input1과 input2는 모두 깊이 depth와 유형이 동일해야 하거나 input2는 스칼라 scalar 일 수 있습니다. 아래 예에서 같이 Numpy 연산으로도 이미지 덧셈 연산을 할 수 있습니다. 다만 결과에서 같이 OpenCV 연산은 포화 Saturation 연산이며 Numpy는 modulo 연산이라는 점에 주의해야 합니다.

 

CV 연산과 Numpy 연산 예)

x = np.uint8([250])

y = np.uint8([10])

z1 = cv.add(x,y) # 250+10 = 260 => 255

z2 = x+y                # 250+10 = 260 % 256 = 4

 

이미지 뺄셈, 곱셈, 나눗셈도 각 cv.substract, cv.multiply, cv.divide로 제공되며 형식은 덧셈 연산과 동일합니다.

 

이미지 혼합 Image Blending

이미지 간 혼합감이나 투명감을 주기 위해 이미지 별 다른 가중치를 부여할 수 있습니다. 단순 연산에 응용으로 Result = (1−α)Image1 + αImage2 처럼 가중치를 다르게 적용하여 두 개의 이미지를 혼합 할 있습니다. OpenCV에서는 cv.addWeighted 함수로 제공되며 두 개의 가중치 α, β와 하나의 offset γ을 활용하여 처리할 수 있습니다. 두 개의 가중치의 합은 항상 1이 되어야 합니다. 그림에서는 로봇에 0.7의 가중치를 OpenCV 로고 이미지에 0.3의 가중치로 혼합한 결과 입니다.

 

result =α⋅img1+β⋅img2+γ

result = cv.addWeighted(img1, α, img2, β, γ)

 

 

이미지 논리 연산 Logical Operations

논리 연산자에는 AND, OR, XOR, NOT 가 있습니다. 논리 연산은 이진 Binary 이미지에 적용되며 픽셀 단위로 수행됩니다. 이진 이미지 처리 시 마스킹, 특정 처리, 형태 분석 등 활용될 수 있습니다. 그림에서 같이 AND의 경우 두 입력이 모두 1일 때 1이 되며, OR 연산은 두 입력 모두 또는 하나가 1일 때 1이 됩니다.

 

 

NOT 연산 cv. bitwise_not() 함수를 이용하며 Result = -Input과 같이 입력에 대한 반전과 같습니다. AND 연산은 아래와 같이 활용할 수 있으며 OR 및 XOR도 각 cv.bitwise_or(), cv.bitwise_xor()로 테스트 해 볼 수 있습니다. Input1과 Input2는 모두 동일한 배열이거나 또는 Input1은 배열, Input2는 Scalar가 될 수 있습니다.

                    

AND 연산 파이썬 예)

Result = cv.bitwise_and(Input1, Input2)

(docs.opencv.org 참조)

 

형태학적 변환 Morphological Transformation은 이미지 형태를 기반으로 한 몇 가지 단순한 연산이며, 보통 이진 Binary 이미지에서 수행됩니다. 한 단계 더 나아가 그레이 Gray 이미지에서도 가능합니다. 동작을 위해서는 원본 이미지와 변환의 특성을 결정하는 마스크 또는 커널을 활용합니다. 기본적인 형태학 연산자는 침식 Erosion과 팽창 Dilation입니다. 그리고 열림 Opening, 닫힘Closing, 기울기 Gradient 등과 같은 변형 연산도 수행할 수 있습니다. 현 블로그에서는 이진 이미지 기준으로 기본 변환을 설명합니다.

 

영상처리에서 형태학적 변환 연산은 관심영역 또는 물체의 크기를 재정의 하거나 잡음 Noise 제거에 빈번히 활용됩니다.

 

1.  침식 Erosion 연산

침식 Erosion은 흰색 영역을 전경이라고 했을 때 흰색 영역의 가장자리를 기준으로 감소시키는 역할을 합니다. 기본 동작은 원본 이미지 기준으로 커널 간 컨볼루션 Convolution 수행이며, 원본 이미지의 픽셀(1 또는 0)은 커널 아래의 모든 픽셀이 1일 때만 1로 간주되고, 그렇지 않으면 침식됩니다(0으로 만듭니다). 따라서 커널의 크기에 따라 경계 근처의 픽셀들이 모두 침식될 수 있으며, 전경 객체의 두께나 크기가 감소하거나 이미지에서 단순히 흰색 영역이 감소합니다. 작은 흰색 잡음을 제거하거나, 연결된 두 개의 객체를 분리하는 등에 유용합니다. Python 예에서 커널 kenel은 모든 element가 1인 5X5 매트릭스이며, Input_Img와 결과 이미지는 이진 Binary 이미지 입니다.

 

Python Example)

kernel = np.ones((5,5),np.uint8)

Erosion_Img = cv.erode(Input_Img, kernel, iterations = 1)

 

 

2. 팽창 Dilation 연산

팽창 연산은 침식과 반대의 효과를 내며, 커널 아래의 적어도 하나의 픽셀이 '1'이면 픽셀 요소는 '1'입니다. 따라서 이미지에서 흰색 영역이 커지거나 전경 물체의 크기가 커집니다. 침식은 배경에 잡음을 제거하는 효과가 있다면 팽창은 전경 내에 잡음 제거에 효과가 있습니다.

 

Dilation_Img = cv.dilate(Input_Img, kernel, iterations = 1)

 

 

3. 열림 Opening 연산

앞에 설명한 침식과 팽창이 연속 연산을 통해 또 다른 효과를 낼 수 있습니다. 열림 Opening 연산은 침식 연산 후에 팽창 연산을 의미합니다. 그림에서와 같이 침식 효과를 통해 배경 잡음을 제거하고 팽창을 통해 전경의 크기를 보전합니다.

 

Opening_Img = cv.morphologyEx(Input_mg, cv.MORPH_OPEN, kernel)

 

 

4. 닫힘 Closing 연산

닫힘 연산은 팽창 연산 침식 연산을 수행합니다. 그림에서 같이 팽창의 효과로 전경의 잡음을 제거하고 침식을 통해 전경의 크기를 보전합니다.

 

Closing_Img = cv.morphologyEx(Input_Img, cv.MORPH_CLOSE, kernel)

 

 

5. Morphological Gradient

그림에서 같이 팽창 연산 결과와 침식 연산 결과의 차(뺄셈) 연산을 통해 관심 영역인 전경의 에지 Edge를 추출할 수 있습니다.

 

Gradient_Img = cv.morphologyEx(Input_Img, cv.MORPH_GRADIENT, kernel)

 

 

6. 커널 Structuring Element

보통 커널의 형태는 직사각형 모양입니다. 그러나 경우에 따라 타원형 또는 원형 커널이 필요할 수 있습니다. 이를 위해 OpenCV에는 cv.getStructuringElement()라는 함수가 있으며, 커널의 모양과 크기를 전달하면 원하는 커널을 얻을 수 있습니다. 그림은 Python 활용 예입니다.

 

(docs.opencv.org 참조)

 

이미지 개선의 가장 기본처리 방식으로 이미지 히스토그램을 활용합니다. 이미지 히스토그램 Image Histogram 이란 말 그대로 픽셀값의 분포를 나타냅니다. 이를 활용한 이미지 개선 방법 중 하나가 이미지 평활화 또는 균등화 Image Equalization이며 OpenCV 함수 EqualizeHist로 활용해 볼 수 있습니다.

 

 

히스토그램 평활화란 픽셀값 범위를 확장하여 이미지 대비를 개선하는 방법입니다. 그림에서처럼 원본 이미지의 픽셀값의 분포는 중간에 모여 있으며 이를 픽셀의 최소(0) 및 최대(255) 범위로 평활화 하게 되면 대비가 개선된 이미지를 얻을 수 있습니다. 조금 더 세부적으로 원본 이미지의 히스토그램의 누적분포함수(CDF)를 활용하여 픽셀값에 재맵핑 Remapping을 통해 균등화 할 수 있습니다. 수식은 생략하도록 하겠습니다.

 

활용 예)

(C/C++) equalizeHist( Input_Image, Result_Image);

(Python) Result_Image = cv.equalizeHist(Input_Image)

 

파라미터 Input_Image는 8-bit gray image로 결과 또한 8-bit gray 입니다. 

 

영상처리 알고리즘 Algorithm을 설계할 때 전처리 과정에 필수적으로 사용되는 것이 영상에 잡음 Noise을 제거하기 위한 함수 입니다. 몇 가지 명칭으로 사용되며 이미지 블러링 Image Blurring  또는 이미지 스무딩 Image Smoothing 등에  명칭으로 사용이 되는데 유사한 의미로 볼 수 있습니다. 신호처리에서 표현하는 저역통과 필터 Lowpass Filter로도 볼 수 있습니다. 평균 필터 Mean Filter, Averaging Filter에 명칭으로도 쓰이며 변형된 필터인 가우시안 필터 Gaussian Filter, 중간값 필터 Median Filter로도 응용될 수 있습니다. 원리로 보면 저역통과라는 단어에서 느껴지는 것처럼 고주파 신호를 제거하고 저주파 신호만 받아들이겠다는 의미이기도 합니다.

 

OpenCV에는 위에서 처럼 Smooth라는 함수로 구현이 되어 있습니다. Src는 원본영상, 그리고 Dst는 결과영상을 나타내고 기본적으로 8 bits 영상을 사용합니다. Size1Size2는 각 Aperture withheight를 나타내며, 다시 말해 적용하고자 하는 마스크 mask의 크기입니다. 예를 들어 3x3, 5x5, 7x7 등에 마스크 크기를 설정하면 되고, Smooth Type 중 가우시안 마스크 CV_GAUSSIANCV_BILATERAL을 이용 시에는 Sigma를 활용할 수도 있습니다. 마스크에 형태 Type CV_BLUR는 평균 필터, CV_MEDIAN은 중간값 필터를 의미합니다. 참고로 CV_BILATERALGaussian filter의 응용으로 Non-Linear한 특성과 경계선 보존 Edge-Preserving 특징을 가지는 필터로 영상처리기술에서 추가로 설명하도록 하겠습니다.

 

사용 예)

cvSmooth( Input_Image, Result_Image, CV_BLUR, 3, 3, 0, 0)

 

3x3 마스크 크기의 평균 필터를 적용하고자 할 때 위 예처럼 사용하면 됩니다. Smooth 함수는 알고리즘 개발에 전처리 과정에도 많이 사용되지만 그 자체 원리를 이용하여 디지털 카메라, 스마트폰 등에서 사진 블러효과 Blur Effect 로도 응용되고 실생활에서 자주 접할 수 있는 기능이기도 합니다.

윤곽선 검출 Edge Detection은 물체에 경계선을 추출하기 위한 기술 입니다. 우리가 알고자 하는 물체의 모양, 크기, 위치 등 정보를 확인하고자 할 때 사용되는 기술로 알고리즘의 전처리 과정에서 이용됩니다. 요즘 기술개발이 활발히 진행되고 있는 Machine Learning의 한 분야인 딥러닝 Deep Learning에서 영상의 특징점 Feature 을 정의하는데도 사용되는 전처리 기술 입니다.

Edge Detection 기술이 사용 된지는 오래됐으며 현재까지도 폭넓게 사용되고 있고, 수학적 접근방식에 따라 다양한 방법들이 존재합니다. 현 이야기에서는 OpenCV에서 제공되는 윤곽선 검출 도구 중 Sobel Edge Detection Canny Edge Detection 기술 사용법에 대한 설명입니다. Edge Detection에 앞에 붙어 있는 Sobel Canny는 개발자에 이름이며 WIKIPEDIA에 의하면Sobel Filter 1968년과 Canny Edge Detector 1986년에 개발되었습니다. 정말 오래된 기술 입니다만 현재도 상당히 많이 사용되고 있고, 이러한 윤곽선 검출 기술에 기본 원리는 미분 연산자 Differentiation Operator에 의한 밝기 변화 탐색 입니다. 다시 말해, 물체의 가장자리에서 밝기 변화가 크므로 Pixel 값에 차이를 통해 윤곽선 유무를 판단할 수 있다는 의미이기도 합니다.

위에서처럼 OpenCV에서 제공되는 Edge Detection 함수인 Sobel Canny를 볼 수 있습니다. 먼저 cvSobel 함수를 살펴보면 앞에서 설명한 기본 함수들에서처럼 입력영상인 “src”와 결과영상을 담기위한 “dst”가 보입니다. “aperture_size” Sobel Mask의 크기를 나타내고 “3”이면 3X3을 의미합니다. “xorder”“yorder” Sobel Mask 연산 시 결과값의 위치를 나타내는데 3X3의 경우 중심인 xorder = 1 yorder = 1 이 되며, Mask의 시작점은 (0, 0)이니 2가 아닌 1이 됩니다.

 

Sobel 사용 예)

cvSobel( Input_Image, Result_Image, 1, 1, 3)

cvConvertScaleAbs(Result_Image, Convert_Result_Image, 1, 0)

 

cvSobel 함수 사용은 위에 예처럼 사용하면 되는데 cvConvertScaleAbs()라는 함수가 더 있죠? cvSobel 함수 사용 시 주의할 점이 있습니다. 앞에서 언급했듯이 Edge Detection의 원리가 Pixel의 차이를 이용하기 때문에 결과에서는 마이너스 “-“ 값이 존재하고 Result_Image Depth는 보통 Input_Image Depthunsigned 8-bit 이니 signed 16-bit 으로 구성되어야 합니다. 따라서 최총 결과를 확인하기 위해서는 절대값을 이용하여 다시 unsigned 8-bit 으로 변환해 줘야 하고, 이때 사용되는 함수가 cvConvertScaleAbs() 입니다.

 

cvCanny 함수의 경우 입력영상인 “image”와 결과영상인 “edges”가 보이고 “apertureSize = 3” Sobel Mask   3X3을 의미합니다. 여기서 cvSobel 함수와 다르게 “threshold1”“threshold2”를 입력하게 되어 있는데, “threshold1” 이하는 외곽선이 아닌 영역으로 “threshold2” 이상은 외곽선인 영역, 그리고 “threshold1”“threshold2”의 사이는 Canny Procedure에 의해 외곽선 유무를 판단하게 됩니다.

 

Canny 사용 예)

cvCanny( Input_Image, Result_Image, 100, 200, 3 )

 

cvCanny 사용 예에서 threshold1threshold2 100 2000 ~ 255의 범위를 갖는 8-bit 영상 기준으로 설정된 값을 의미하고, Result_Image Input_Image와 동일한 속성으로 설정하면 됩니다. 앞에 설명과 그림 결과와 같이 8-bit Input_Image 기준으로 cvSobel 함수의 최종 Result_Image 8-bit 그레이 Gray 영상이며, cvCanny 함수의 경우 8-bit 바이너리 Binary 영상이니 이것만 주의해서 활용하면 됩니다. Sobel Canny의 수학적 또는 알고리즘 접근에 대해서는 영상처리기술에서 추가적으로 다뤄보도록 하겠습니다.

물체 추적 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에서 제공되는 기본 함수들을 쉽게 이용할 수 있게 됩니다.

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

(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.

+ Recent posts