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

영상처리 기술은 이미지를 활용하는 다양한 산업분야에서 핵심적인 역할을 하고 있습니다. 현재 많은 분야에서 확장되고 있는 AI분야 머신러닝과 딥러닝에서도 부분적으로 영상기술 이론이 주요하게 사용되고 있습니다. 영상처리 기술을 활용하는 산업 분야를 간략히 요약하면 아래와 같습니다.

 

산업 자동화

  • 제조 공정에서 불량품 검출, 로봇 비전 등에 활용되며, 고속 카메라와 영상분석을 통해 사람의 개입 없이 품질을 관리할 수 있습니다.

의료 영상

  • MRI, CT, X-ray 등에서 병변을 자동으로 식별하거나, 조직을 정량적으로 분석하며, 진단 정확도를 높여 줍니다.

보안 및 감시

  • CCTV 영상에서 이상행동 탐지, 얼굴 인식, 번호판 인식 등에 사용되며, 범죄 예방 및 수사에 핵심적인 역할을 합니다.

자율주행

  • 카메라로 주변 물체를 인식하고, 차선, 신호, 보행자 등을 분석하며, 딥러닝을 활용한 실시간 처리에 핵심적인 역할을 합니다.

엔터테이먼트 및 미디어

  • 영상 편집, 필터 적용, 실시간 합성, 가상현실(VR), 증강현실(AR) 등에서 쓰이며, 사용자 경험 UI/UX에도 활용됩니다.

 

몇 년 사이에 AI기술이 확장 및 확대 되면서 컴퓨터 비전과 영상처리 라이브러리들이 다양화 되었습니다. 특히 파이썬 Python 프로그래밍 활용이 확대 되면서 파이썬 관련 영상처리 라이브러리가 많아진 것을 볼 수 있습니다. 아래는 대표적인 라이브러 설명이며, OpenCV의 경우 참 오래된 라이브러이기도 하고 꾸준히 사용되 되었습니다. AI 성장과 함께 현재는 영상처리 활용에 핵심 라이브러리의 하나이기도 합니다.

 

1) OpenCV (Open Source Computer Vision)

  • 가장 널리 사용되는 오픈소스 라이브러리. 영상 입출력, 필터, 물체 인식 등 광범위한 기능을 제공하며 C/C++과 파이썬에서 활용할 수 있습니다.

2) MATLAB

  • 영상처리 전용 툴박스 제공, 연구 및 교육용으로 활용도 높으며 최근 실무에서도 활용도가 높아지고 있습니다. MATLAB 자체가 유료이므로 라이브러리도 유료로 사용할 수 있습니다.

3) Pillow(PIL)

  • 파이썬 기반 영상 처리 라이브러리이며, 단순한 이미지 처리에 적합합니다.

4) Scikit Image

  • 파이썬 과학 연산 라이브러리 기반 영상처리 라이브러리이며, 연구 및 분석 목적에 적합합니다.

5) PyTorch

  • 파이썬 머신러닝, 딥러닝 기반 영상처리에 적합하며 분류, 객체탐지, 세크멘테이션에 활용 됩니다.

6) MediaPipe

  • 구글에서 개발한 실시간 영상처리 프레임워크이며 얼굴, 손, 포즌 인식에 이용됩니다. C/C++ 및 파이썬을 통해 활용할 수 있습니다.

 

이미지 처리는 단순 필터 적용을 넘어서 AI와 융합되어 인공지능 기술의 시각지능의 핵심이 되고 있습니다. 특히 영상에서의 의미 있는 정보 추출과 자동화가 가능해져 다양한 기술 분야에 확대 적용되고 있습니다. 

 

영상처리 라이브러리 중 MediaPipe에 대해 조금 더 알아 보겠습니다. MediaPipe는 머신러닝 기반의 멀티모달 파이프라인을 쉽게 만들고 실행할 수 있게 해주는 프레임워크입니다. 실시간 영상에서 정교한 분석을 저지연으로 처리할 수 있도록 설계되어, 모바일, 데스크탑, 웹 등 다양한 환경에서 실행 가능합니다.

 

MediaPipe의 주요 특징으로는 CPU에서도 실시간 처리가 가능할 정도로 경량화 된 모델 구조이며, 각 기능이 독립된 컴포넌트로 구성되어 있습니다. 크로스 플랫폼으로 사용 가능하며, 사전 학습된 모델도 제공 됩니다. 기능으로는 얼굴 감지 및 인식, 손 제스처 인식, 포즈 예측, 신체 모션 분석, 3D 객체 인식 등이 있습니다. 아래는 설치 방법 입니다.

 

설치 : pip install mediapipe opencv-python

파이썬 활용 시: import mediapipe as mp

 

추가로 OpenCV는 .NET 프레임워크 환경 C# 등에서도 활용 가능합니다. OpenCvSharp은 C++ OpenCV의 .NET 바인딩 라이브러리입니다. 쉽게 이야기 하면 C++ 코드의 함수를 C#에서 호출하는 방식으로 볼 수 있습니다. 아래 첫번째 예는 OpenCvSharp을 이용한 이미지 읽기이며, 두번째는 웹캠 영상 로드 예 입니다.

 

// 이미지 읽기
using OpenCvSharp;

Mat image = Cv2.ImRead("lena.jpg");
Cv2.ImShow("lena", image);
Cv2.WaitKey(0);

 

// 웹캠 이미지 로드
using OpenCvSharp;

using var capture = new VideoCapture(0);
using var window = new Window("WebCam");

var frame = new Mat();
while (true)
{
    capture.Read(frame);
    if (frame.Empty()) break;

    window.ShowImage(frame);
    if (Cv2.WaitKey(1) == 27) break; // esc 종료
}
728x90
728x90

영상처리 기술에서 보간법은 이미지 확대나 회전, 좌표 변환 기술 Affine Transform 등 알고리즘 구현 시 빈번히 사용됩니다. 머신 러닝 Machine Learning 및 딥러닝 Deep Learning 등 특히 CNN 계열에 Coarse Map을 Dense Map으로 Up-Sampling시 활용되는 기술이기도 합니다. 이미지를 두 배로 확대할 때 보간법은 새로운 픽셀 Pixel 값을 그럴듯하게 예측하는 기술로 볼 수 있습니다. 이론적인 부분은 영상처리 기술에서 다루도록 하겠습니다.

 

기본적인 보간법 세가지는 아래와 같습니다.

 

1. 최근접 이웃 보간법 Nearest Neighbor Interpolation

- 소수점 좌표에서 가장 가까운 정수 좌표 픽셀 사용, 수행속도가 가장 빠르지만 계단 현상 및 깨짐 현상 발생

 

2. 양선형 보간법 Bilinear Interpolation

- 주변 4개 픽셀을 사용해 선형 평균을 이용, 최근접 보다 자연스러운 결과를 보이고 일반적으로 많이 활용되는 기술

 

3. 양큐빅 보간법 Bicubic Interpolation

- 주변 16개 픽셀을 활용하며 앞에 두 기술보다 자연스러우며, Super Resolution 기술들에서 비교 결과로 많이 사용, 고화질 이미지 편집에 사용되는 기술이며 처리속도는 느림

 

이미지 회전 시 보간법이 사용되는 이유는 회전은 수학적으로 기존 픽셀 좌표를 회전 행렬로 이동시키는 과정입니다. 회전 시 생성되는 좌표는 보통 소수점 좌표가 되며, 새로운 평면에 매칭 시 좌표는 소수점이 아닌 정수이기때문에 빈공간이 생기게 됩니다. 그 빈공간을 채워주기 위해 보간법이 활용됩니다. 예를 들어 좌표 (5, 5)를 30도 회전하면 (5.3, 3.9) 되므로 실제 좌표 매칭을 위해서는 주변 픽셀 (5, 3), (6, 3), (5, 4), (6, 4)를 이용하여 추정해야 합니다.

 

OpenCV에서 이미지 회전 및 확대 시 보간법을 지정할 수 있습니다. 아래는 파이썬 활용시 CV 상수 입니다. 첫번째 예제는 회전시 파이썬 코드이며, 이전 블로그에서 설명한 “cv2.warpAffine” 함수를 사용합니다. 두번째 예제는 “cv2.resize” 함수를 활용한 보간법 사용 예입니다. 

 

1. 최근접 이웃 보간법 - cv2.INTER_NEAREST

2. 양선형 보간법 - cv2.INTER_LINEAR

3. 양큐빅 보간법 - cv2.INTER_CUBIC

4. Lanczos 보간법 - cv2.INTER_LANCZOS4

 

# 이미지 회전 예제
import cv2
import numpy as np

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

# 회전 중심, 각도, 스케일
center = (img.shape[1] // 2, img.shape[0] // 2)
angle = 50
scale = 1.0

# 회전 행렬 생성
M = cv2.getRotationMatrix2D(center, angle, scale)

# 양큐빅 보간법 사용예
rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]), flags=cv2.INTER_CUBIC)

# 결과 보기
cv2.imshow('Rotated Image', rotat_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

# 이미지 확대 예제
img = cv2.imread('lena.jpg')

# 2배 확대, 선형 보간법
resized = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)

# 결과 보기
cv2.imshow('Resized Image', resiz_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
728x90

+ Recent posts