728x90

시간 영역의 신호를 주파수 영역으로 변환하여 처리나 해석하는 이론이 푸리에 변환 Fourier Transform 입니다. 신호처리 분야에서 주파수 영역 분석을 위한 중요한 이론이기도 합니다. 영상처리에서는 이미지를 2차원 신호로 보고 푸리에 변환을 이용할 수 있으며, 이미지 공간 정보를 주파수 성분으로 바꾸어 분석할 수 있습니다. 분석을 통한 응용은 이미지 필터링, 압축, 복원등에 활용됩니다.

 

푸리에 변환은 이론적으로 4가지 형식으로 구분됩니다. 영상처리에 활용되는 기법은 이산 푸리에 변환 DFT (Discrete Fourier Transform) 입니다. 아래는 2차원 이산 푸리에 변환 수식이며 오일러 공식과 결합된 형태 입니다.

 

 

여기서 f(x,y)는 원본 이미지의 픽셀 값, F(u,v)는 주파수 평면에서의 값, M과 N은 이미지 크기인 Width와 Height 입니다. 추가로 푸리에 변환 요소에는 각 주파수 성분의 세기를 나타내는 크기 Magnitude와 성분의 위치 정보를 나타내는 위상 Phase 정보가 있으며, 위상 정보는 이미지의 구조를 유지하는데 중요한 요소입니다.

 

이미지를 푸리에 변환하면 최종 주파수 영역에 중심에는 저주파, 바깥쪽에는 고주파로 구성됩니다. 고주파는 이미지에서 물체의 윤곽선과 같은 에지 Edge 성분들을 의미하고 저주파는 물체의 전반적인 형태를 나타냅니다. 따라서 응용에서는 이러한 특징을 이용하여 저역통과 Low-pass 필터링 및 고역통과 High-pass 필터링을 통해 이미지의 경계 강조나 블러 효과를 낼 수 있습니다. 이미지 압축에서는 고주파 성분이 적으면 적을 수록 작은 정보만으로 이미지 재구성이 가능해지며, 대표적으로 JPEG 손실 압축 알고리즘에서 푸리에 이론의 일종인 이산 코사인 변환 DCT(Discrete Cosine Transform)을 사용합니다.

 

코드를 통해 푸리에 활용 방법을 확인해 보겠습니다. 실무에서는 C/C++, Python, Matlab 등 알고리즘 구현시 FFT (Fast Fourier Transform)을 이용합니다. DFT의 계산 복잡도 때문에 FFT를 활용하게 되며, 예를 들어 샘플 수가 N=1024일 때 DFT는 약 100만번의 연산이 필요한 반면 FFT는 10,000번의 연산이 필요합니다. 아래와 같이 파이썬 Numpy에서는 “np.fft.fft2” 함수를 사용하여 이미지 평면을 주파수 평면으로 변환하며, “np.fft.fftshift” 함수를 통해 저주파 성분을 중심으로 이동 시킵니다. 반대로 주파수 평면에서 이미지 평면으로 변환 시, “np.fft.ifftshift” > “np.fft.ifft2” 함수 순으로 적용할 수 있습니다. 

 

FFT의 이론 및 응용에 대해서는 추후 예와 함께 좀더 상세히 다루도록 하겠습니다.

 

import cv2
import numpy as np

# 이미지 불러오기 (그레이스케일)
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)

f = np.fft.fft2(img) # 푸리에 FFT 변환
fshift = np.fft.fftshift(f)  # 중심 이동

magnitude_spectrum = 20 * np.log(np.abs(fshift)) # 주파수 스펙트럼 확인

f_ishift = np.fft.ifftshift(fshift_filtered) # 중심 복원
img_ifft = np.fft.ifft2(f_ishift) # 역 FFT 적용

# 실수 이미지 변환
img_re = np.abs(img_ifft)
728x90
728x90

보간법 Interpolation 은 영상처리에서 자주 활용됩니다. 이미지 확대나 변환 시 원본 이미지의 특성을 보전하고자 하는 해상도 개선 기법의 기본 입니다. 양선형 보간법 Bilinear Interpolation은 단어에서 같이 선형 보간법을 두번 반복하는 방법이며, 양선형 필터링 또는 양선형 맵핑 등으로도 언급됩니다. 현 블로그에서는 보간법의 이론적인 부분을 간략 다뤄보겠습니다.

 

양선형 보간 과정을 살펴보면, 그림에서 우리가 알고 싶은 점은 실수 좌표 (x, y)에 위치한 픽셀 값입니다. 이 실수 좌표는 정수 좌표 A, B, C, D의 픽셀 사이에 있으며, 이 정수 좌표의 픽셀 값을 이용하여 보간 할 수 있습니다.

 

 

 

4개의 좌표의 픽셀 값을 식으로 표현하면,

 

A = f(x1, y1), B = f(x2, y1), C = f(x1, y2), D = f(x2, y2)

보간 위치: (x, y), 여기서 x1 ≤ x ≤ x2, y1 ≤ y ≤ y2

 

계산 과정을 단계로 보면,

1) X 방향 보간

(A와 B 사이) R1=(x2−x)/(x2−x1)∗A+(x−x1)/(x2−x1)∗B

(C와 D 사이) R2=(x2−x)/(x2−x1)∗C+(x−x1)/(x2−x1)∗D

 

2) Y 방향 보간

(R1과 R2를 이용) P(x,y)=(y2−y)/(y2−y1)∗R1+(y−y1)/(y2−y1)∗R2

 

3) 하나의 공식으로 표현하면,

P(x,y)=A∗(x2−x)∗(y2−y)+B∗(x−x1)∗(y2−y)+C∗(x2−x)∗(y−y1)+D∗(x−x1)∗(y−y1)

여기서, 픽셀 간격이 “1”이라고 가정합니다. 참고로 “1”이 아닌 경우 (x2-x1)*(y2-y1)으로 정규화해주는 것이 일반적입니다.

 

단계별 공식 변환에서처럼 X축 방향과 Y축 방향으로 각각 적용한 방법이 양선형 보간법 입니다. 더 확장해보면 위 식은 다선형 다항식 Multilinear Polynomial 형태로 변환하여 문제를 풀 수 있습니다. 양선형 보간은 이차 다항식이 아니라 두 변수 일차 다항식으로 생각할 수 있으며, 어떤점 (x, y)에서의 값을 2차원이 아닌 일차 다항식 형태로 근사합니다.

 

하나의 공식으로 합쳐진 P(x, y)를 아래와 같이 좌표 (x, y) 기준 다항식으로 변환 할 수 있습니다.

f(x,y)=a0​+a1​x+a2​y+a3​xy

a0​=Ax2​y2​−Bx1​y2​−Cx2​y1​+Dx1​y1

a1​=−Ay2​+By2​−Cy1​+Dy1​

a2​=−Ax2​+Bx1​+Cx2​−Dx1​

a3=A+D−B−C

 

따라서 위 f(x,y) 식을 선형시스템으로 가정하여 우리가 알고 있는 4개의 위치 A, B, C, D를 행렬식으로 정리하여 선형대수로 계수 a0, a1, a2, a3를 구할 수 있습니다. 간략히 Ax=b 형태의 Matrix 계산으로 변환할 수 있으며, 주변 4개의 좌표를 이용한 양선형 보간법의 예를 파이썬 코드로 확인 할 수 있습니다. 계수 계산 시 np.lianlg,solve 함수를 사용합니다.

 

| 1 x1 y1 x1y1 |  |a0|      |f1|

| 1 x2 y1 x2y1 |  |a1|  =  |f2|

| 1 x1 y2 x1y2 |  |a2|      |f3|

| 1 x2 y2 x2y2 |  |a3|      |f4|

 

# Linear System Solution Ax=b
import numpy as np

# 4개 점의 좌표와 픽셀값
x1, x2 = 0, 1
y1, y2 = 0, 1
f1, f2, f3, f4 = A, B, C, D

# 계수 행렬 A
M = np.array([
    [1, x1, y1, x1*y1],
    [1, x2, y1, x2*y1],
    [1, x1, y2, x1*y2],
    [1, x2, y2, x2*y2],
])

# 함수값 벡터
f = np.array([f1, f2, f3, f4])

# 계수 a0, a1, a2, a3 계산
a = np.linalg.solve(M, f)

# 양선형 보간 함수
def bilinear_interp(x, y):
    return a[0] + a[1]*x + a[2]*y + a[3]*x*y
728x90
728x90

블로그에 글 항목들을 보니 컴퓨터 비전, 이미지 처리의 가장 기본적인 항목이 빠져 있어 이 참에 작성해 봅니다. 이미지라는 것은 현실 세계의 한 장면을 센서로 취득한 뒤 2차원 형태의 매트릭스 Matrix로 디지털화 한 데이터로 볼 수 있습니다. 이 매트릭스 하나의 셀 Cell을 픽셀 Pixel 이라고 합니다. 각 픽셀은 색상과 밝기를 수치로 저장 할 수 있습니다.

 

  • 픽셀 Pixel (Picture Element)

이미지를 구성하는 가장 작은 단위 입니다. 디스플레이를 위한 각 픽셀은 정수 Unsigned Integer로 저장되며 이미지 처리 시 부동소수점 Floating Point 형태로 변환하여 계산할 수 있습니다. 예를 들어 보통 우리가 보는 흑백 이미지 Grayscale의 경우 픽셀 값의 범위는 0~255의 값을 갖습니다.

 

  • 해상도 Resolution

해상도는 이미지의 크기를 의미합니다. 이미지의 "가로 Width X 세로 Height = 픽셀 수" 로 표현되고, 우리가 TV를 구매할 때 HD, Full HD, Ultra HD 용어가 해상도를 나타냅니다. 예를 들어 HD는 1280x720, Full HD는 1920x1080, Ultra HD는 3840x2160 크기로 정의되고, 계산해보면 Full HD는 207만 개 이상의 픽셀로 구성됨을 알 수 있습니다.

 

  • 채널 Channel

이미지 처리에서 채널은 색상 성분을 나누어 표한 각각의 구성 요소를 의미합니다. 흑백 이미지 Grayscale의 경우 밝기 정보만 존재하므로 1-채널로 볼 수 있습니다. 칼라 이미지 RGB의 경우 색상 표현을 위한 빨강, 초록, 파랑의 3개의 채널로 구성 됩니다. 이미지 처리를 하다 보면 칼라 이미지인데 RGBA 형태도 볼 수 있으며, 마지막 A는 투명도 조절 역할을 하는 채널입니다. 예를 들어 A의 값이 낮아질 수록 빨강색은 연한 빨강색으로 표현됩니다.

 

  • 깊이 Bit Depth

한 픽셀의 색 또는 밝기를 표현할 수 있는 단계의 범위 입니다. 우리가 생활에서 접할 수 있는 흑백 이미지 Grayscale의 경우 256단계의 범위를 가지며 8-bit 이미지라고도 합니다. 칼라 이미지는 RGB 각각 8-bit으로 구성되며 합쳐서 24-bit 이미지로 불립니다. (8-bit: 2의 8승 = 256) 세부적인 처리가 필요한 의료 분야 등에서는 10-bit (1,024 단계) 이상의 범위로 이미지를 저장하여 활용합니다.

 

  • 포맷 Format (이미지 저장 형식)

일상에서 이미지는 메모리에 파일 형태로 저장되며, 그 파일 형태를 포맷이라고 합니다. 가장 익숙한 포맷은 BMP와 JPG가 있습니다. BMP는 마이크로소프트에서 개발된 디지털 이미지 포맷이며 무손실 이미지로 저장되므로 파일 크기가 큽니다. JPG는 ISO와 ITU-T에서 제정된 손실 압축 방법의 표준 이미지 포맷입니다. 손실 압축이므로 압축 비율에 따라 데이터 크기는 작아 질 수 있습니다. 이 외 TIFF가 있으며 앨더스사와 마이크로소프트가 공동 개발한 이미지 포맷이며 무손실 및 손실 압축이 가능하고 사용자가 고쳐서 사용할 수 있는 유연함이 특징입니다. 추가로 GIF, PNG, RAW 등의 포맷이 있습니다.

 

  • 이미지 저장 공간 

흑백 이미지 Grayscale의 경우 1-채널이므로 메모리에는 2차원 배열로 저장됩니다. 칼라 이미지 RGB는 3-채널이므로 3차원 배열로 저장됩니다. 아래는 Grayscale과 RGB의 각 픽셀값을 추출하는 파이썬 예제 코드 입니다. RGB 추출 시 순서는 B, G, R 이니 혼동하지 않도록 주의해야 합니다.

 

# Grayscale

gray = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 이미지 로드

pixel_value = gray[50, 100] # 픽셀 정보 출력, 좌표 (50, 100)

 

# RGB

img = cv2.imread('image.jpg') # 이미지 로드

(b, g, r) = img[50, 100] # 픽셀 정보 출력 (좌표 (50, 100)) → [B, G, R]

 

이상에서 같이 디지털 이미지는 2차원 매트릭스 구조로 볼 수 있으며, 2차원 이산 신호처리 2D Discrete Signal Processing을 적용 할 수 있습니다. 영상처리에 적용되는 이론들 대부분이 푸리에 변환 및 필터링 등과 같은 신호처리 개념입니다.

728x90
728x90

Affine Transform 어파인 변환 (또는 아핀 변환)은 컴퓨터 비젼과 로봇, 그래픽스 등에서 사용하는 좌표 변환 기술 입니다. 일반적인 영상처리에서는 그 좌표점에 Intensity를 다뤘다면 기하학 변환에서는 좌표의 변경을 통해 물체의 위치, 크기, 기울기, 방향 등을 변환하는 기법으로 볼 수 있습니다.

 

선형 변환과 이동을 조합하여 2차원 또는 3차원 변환을 할 수 있어 수학적으로는 선형 대수 Linear Algebra와 밀접합니다. 간략하게 정의를 보게 되면, 변환된 좌표 (x’, y’)는 원래 좌표 (x, y)에 대해 다음과 같이 표현할 수 있습니다.

 

[ x'; y'] = [a b; c d][x; y] + [e; f]

여기서 [a b; c d] : 선형 변환 행렬, [e; f]: 이동 벡터

 

위 변환을 동차 좌표 homogeneous coordinates로 바꾸면 아래의 같이 하나의 행렬곱으로 표현 가능합니다.

 

[x'; y'; 1] = [a b e; c d f; 0 0 1][x; y; 1]

 

동차 좌표계 Homogeneus coordinates 는 우리가 일반적으로 사용하는 카르테시안 좌표계와 달리 추가적인 차원을 포함하여 변환을 쉽게 수행할 수 있습니다. 특히 Affine Transform과 Projective Transform 같은 변환을 하나의 행렬 연산으로 통합하기 위해 사용됩니다.

 

선형 변환 행렬은 변환 종류에 따라 아래와 같습니다. 이동 Translation은 이동 벡터에 따른 위치 변환이며, 이 외 변환은 중심에 변화가 없는 선형 변환으로 볼 수 있습니다. Affine Transform의 주요 특징은 1) 변환 후에도 직선은 그대로 직선인 직선성 유지, 2) 평행한 선은 변환 후에도 평행 유지, 3) 확대 및 축소 시 모양 유지, 4) 변환 후에도 역변환 가능 정도로 요약할 수 있습니다. 기하학 변환은 실무에서 이미지 왜곡 보정, 물체 추적, 이미지 파노라마, 카메라 켈리브레이션, 증강 현실 등에 활용되며 3D 게임에 기본 이론으로도 볼 수 있습니다.

 

Translation (이동 변환) 위치를 이동
Scaling (크기 변환) 크기를 조절
Rotation (회전 변환) 축을 중심으로 회전
Shearing (기울임 변환) 평행 형태 기울임 변형
Reflection (반사) 대칭 이동  

 

아래는 Affine Transform 중 이미지 위치 변환에 대한 Python, Matlab, C# 코드 활용 예입니다. 파이썬에서는 warpAffine 함수를 사용할 수 있으며, 매트랩에서는 affine2d와 imwarp을 활용 할 수 있습니다. C와 C#에서는 OpenCV를 활용하여 쉽게 테스트 해 볼 수 있습니다.

 

import cv2
import numpy as np
# 이미지 로드
image = cv2.imread("lena.jpg")
# 변환 행렬 생성 (x축 50px 이동, y축 30px 이동)
M = np.float32([[1, 0, 50], [0, 1, 30]])
# Affine 변환 적용
transformed_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 결과 출력
cv2.imshow("Original Image", image)
cv2.imshow("Affine Transformed Image", transformed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
% 이미지 로드
image = imread('lena.jpg');
% Affine 변환 행렬 생성
T = affine2d([1 0 0; 0 1 0; 50 30 1]); % x축 50px, y축 30px 이동
% Affine 변환 적용
transformed_image = imwarp(image, T);
% 결과 출력
subplot(1,2,1), imshow(image), title('Original Image');
subplot(1,2,2), imshow(transformed_image), title('Affine Transformed Image');
using OpenCvSharp;
class Program
{
    static void Main()
    {
        // 이미지 로드
        Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color);
        // 변환 행렬 생성 (x축 50px 이동, y축 30px 이동)
        Mat affineMatrix = new Mat(2, 3, MatType.CV_32F, new float[] { 1, 0, 50, 0, 1, 30 });
        // Affine 변환 적용
        Mat transformedImage = new Mat();
        Cv2.WarpAffine(image, transformedImage, affineMatrix, new Size(image.Width, image.Height));
        // 결과 출력
        Cv2.ImShow("Original Image", image);
        Cv2.ImShow("Affine Transformed Image", transformedImage);
        Cv2.WaitKey(0);
    }
}
728x90
728x90

인간의 시각 시스템 The Human Visual System은 가시광선(400nm~700nm) 영역에서 수십만 가지의 색상을 구별 할 수 있지만 회색 음영 변화의 경우 약 100가지 정도를 구별할 수 있습니다. 색상 정보 Color Information도 이미지에 다양하게 포함 될 수 있기 때문에 색상 정보에 기반하여 객체 식별 및 추출 등과 같은 이미지 분석에 활용할 수 있습니다.

 

그레이 이미지 Gray Image는 무채색으로 레벨의 크기 Intensity로 표현되므로 에너지에 의한 물리적 양으로 볼 수 있습니다. 반면 밝기 Brightness 와 휘도 Luminance는 색의 인식적 지각에 의해 결정되므로 심리적 특성에 가깝습니다. 예를 들어 파란색과 초록색이 동일하게 강렬한 경우 파란색은 초록색보다 훨씬 더 어둡게 인식됩니다. 색상은 주로 물체의 반사율 특성에 따라 달라지며 빨간색과 초록색을 모두 반사하는 물체는 녹색이지만 빛을 비추는 빨간색이 없을 때 초록색으로 보이고 반대로 녹색이 없을 때는 빨간색으로 보입니다.

 

색상 모델 Color Model은 3D 좌표계로 표현되며 특정 모델 내에서 구성 가능한 모든 색상을 정의하고 특정 색상을 지정할 수 있도록 합니다. 이미지 분석과 처리를 위한 색상 모델들에는 RGB, CMY, HSI, YIQ, HSV, Lab 등 다양합니다. 현 블로그에서는 일반적인 RGB 외 몇 모델을 살펴 보겠습니다. OpenCV 활용 부분에 색상 모델 좌표 변환 설명을 추가하니 참고해 보면 좋겠습니다.

 

RGB Model

그림에서 같이 직각 좌표계로 표현되는 RGB 모델은 Red, Green, Blue의 3개의 축으로 구성됩니다. 회색 Gray은 검정색 Black과 흰색 White을 잇는 선으로 Spectrum이 표현됩니다. RGB 모델은 실생활에 많이 활용되며 칼라 모니터와 대부분의 비디오 카메라에 사용됩니다.

CMY Model

CMY 모델은 Cyan, Magenta, Yellow를 축으로 하는 색상 모델로, RGB 모델의 경우 특정 색상을 얻기 위해 검정색에 무엇을 추가하는 가산 혼합 Additive Model인 반면 CMY는 흰색에서 무엇을 빼는 Subtractive Model 입니다. 주로 칼라 프린터 및 인쇄물에 사용됩니다. 아래 그림은 색상 인식에 대한 Tristimulus Theory로 좌측은 RGB, 우측은 CMY Model을 나타냅니다.

 

HSI Model

HSI 모델은 Hue 색상, Saturation 채도, 크기(세기) Intensity의 3가지 축에 의해 색상을 정의할 수 있습니다. 그림은 HSI의 색상 입체 공간을 나타내며, Red/Green/Blue는 [0,1]범위로 정규화 됩니다. Hue는 0~360도의 각도, Saturation은 0~1, Intensity는 0(Black)~1(White)로 설정할 수 있으며 RGB 모델 간 변환 관계는 아래와 같습니다.

(homepages.inf.ed.ac.uk 참조)

728x90
728x90

(docs.opencv.org 참조)

 

히스토그램은 이미지의 픽셀 크기별 분포를 그래픽으로 나타낼 수 있습니다. 히스토그램의 X축은 픽셀의 크기(Gray Image: 0~255)를 나타내며 Y축은 영상의 픽셀 수를 나타냅니다. 픽셀 수가 많을수록 특정 밝기 레벨의 피크가 더 높습니다. 히스토그램 균등화(평활화) Histogram Equalization(HE)는 이미지의 대조를 향상시키는데 사용되는 이미지 처리 기술입니다. 이는 가장 빈번한 픽셀값을 효과적으로 펼침으로써, 이미지의 밝기 범위를 확장함으로써 개선 효과를 얻을 수 있습니다. 이를 통해 낮은 국소 대조도의 영역이 더 높은 대조도를 얻을 수 있습니다.

그림에서처럼 픽셀값이 특정 범위의 값으로만 제한되는 이미지를 생각해 있습니다. 예를 들어, 밝은 이미지는 모든 픽셀이 높은 값으로 제한됩니다. 그러나 좋은 이미지는 이미지의 모든 영역에서 픽셀값을 가질 것입니다. 따라서 히스토그램을 끝까지 늘려야 이미지의 대비를 향상시킵니다. 원리를 활용한 이미지 개선 방법이 히스토그램 평활화 기술입니다칼라 히스토그램 평활화는 이미지의 색상 균형에 극적인 변화를 초래하기 때문에 이미지의 빨간색, 녹색 및 파란색 성분에 별도로 적용할 수 없습니다. 그러나 이미지를 HSL/HSV 색 공간과 같은 다른 색 공간으로 먼저 변환 후, 이미지의 색상 및 채도를 변경하지 않고 휘도값에 적용할 수 있습니다.

 

Adaptive Histogram Equalization

적응적 히스토그램 평활화(Adaptive Histogram Equalization) 그대로 적응적, 국소적으로 이미지 밝기를 변환한다는 점에서 일반적인 히스토그램 평활화는 다르며, 로컬 대비를 개선하고 영상의 영역에서 에지의 정의를 강화하는데 적합합니다.

적응적 히스토그램 평활화의 한 방법으로 CLAHE(Contrast Limited Adaptive HE)가 있습니다. CLAHE의 경우, 이미지 대비 제한 과정은 국소적으로 영역을 분할하여 적용하며 일반적인 히스토그램 균등화가 야기할 수 있는 노이즈의 과증폭을 방지하기 위해 개발되었습니다. 아래 첫번째 이미지는 원본 이미지이며, 두번째 이미지는 일반적 히스토그램 균등화(Histogram Equalization) 결과, 세번째는 CLAHE 결과를 나타냅니다. 일반 히스토그램 균등화에서 발생할 수 있는 밝기 포화 Saturation를 CLAHE를 통해 개선할 수 있습니다. 

 

OpenCV에서 createCLAHE 함수로 제공 됩니다. 아래는 Python Code 예입니다.

 

import cv2 as cv

img = cv.imread('input_img.jpg', cv.IMREAD_GRAYSCALE)

clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

cl1 = clahe.apply(img)

cv.imwrite('output_img.jpg',cl1)

728x90
728x90

영상처리 도구에 설명된 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에 제공되는 방법 외에도 다양한 방법들이 존재합니다. 위 방법들에 기본 원리를 잘 이해하면 실무에서 응용하는데 상당한 도움이 될 수 있습니다.

728x90
728x90

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

 

 

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

 

728x90
728x90

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

 

 

728x90

+ Recent posts