[의료이미지CV] 1일차

이번 강의에서는

컴퓨터 비전의 기본 개념을 이해하고,

오픈 소스 라이브러리인 OpenCV(Open Source Computer Vision Library)를 활용하여 디지털 이미지 및 비디오를 처리, 분석하는 기초 지식 및 실습 기술을 습득할 예정입니다.


컴퓨터 비전 (Computer Vision) 개요

컴퓨터 비전은 컴퓨터가 디지털 이미지나 비디오로부터 의미 있는 정보를 추출하고 이해 및 해석할 수 있도록 하는 과학 및 기술 분야입니다.  목표는 인간의 시각 시스템처럼 기계가 시각 데이터를 인식, 처리하여 자율적인 의사 결정을 내릴 수 있도록 하는 것입니다.

쉽게 말해,

카메라를 통해 들어온 이미지나 영상 데이터를 컴퓨터가 사람처럼 '보고, 이해하고, 판단'하는 기술입니다.

 

✔️ 주요 작업 

작업 설명 예시
이미지 분류 이미지에 무엇이 있는지 식별 "고양이" 또는 "개" 식별
객체 검출 이미지 내 특정 객체의 위치를 사각형으로 표시 "사람"이 이 영역에 있음
객체 추적 비디오에서 움직이는 객체의 경로를 따라감 움직이는 차량의 궤적 추적
이미지 분할 픽셀 단위로 객체의 경계를 정확히 구분 배경으로부터 사람의 실루엣 분리

🍀 주요 작업을 비유해 보겠습니다.

• 이미지 분류: 사진을 보고 "이건 사과야"라고 딱 정하는 것.

객체 검출: 사진에서 사과가 있다면 "여기 사과가 있어, 위치는 (X, Y)부터 (W, H)까지야"라고 상자에 담아 위치까지 알려주는 것.

객체 추적: 움직이는 공을 비디오에서 계속 따라가며 공의 움직임을 기록하는 것.


OpenCV (Open Source Computer Vision Library)

실시간 컴퓨터 비전 애플리케이션 개발을 위해 설계된 

가장 널리 사용되는 오픈 소스 라이브러리.


C++로 작성되었지만 Python과의 연동성이 뛰어나며,

복잡한 알고리즘을 쉽게 사용할 수 있도록 표준화된 함수를 제공합니다.

쉽게 말해 컴퓨터 비전을 위한 만능 도구 상자라고 생각하면 됩니다.

복잡한 수학 공식이나 알고리즘을 직접 짤 필요 없이, OpenCV 함수를 호출하기만 하면 됩니다.

특히 Python에서 사용하기 매우 편리합니다.

 

✨ 주요 기능 및 활용 분야 

• 기본 처리: 이미지 읽기/쓰기/표시, 크기 조절, 색상 공간 변환 (BGR ⇔ Gray ⇔ HSV).

필터링: 노이즈 제거 (블러링), 선명화, 경계선 검출 (Canny, Sobel).

특징점 검출 및 매칭: 코너, 엣지 등을 찾아 객체 인식 및 이미지 정렬에 활용.

객체 검출: Haar Cascade를 이용한 얼굴 검출, 딥러닝 기반 모델 (DNN 모듈) 활용.

비디오 분석: 움직임 감지, 옵티컬 플로우(Optical Flow).

 

👍🏻 OpenCV의 장점 

오픈 소스: 누구나 무료로 사용 가능하며 방대한 커뮤니티 지원을 받습니다.

고성능 (High Performance): 핵심 기능은 C/C++로 구현되어 속도가 빠릅니다.

(Python으로 코드를 짜더라도, 실제로 연산이 이루어지는 핵심 부분은 속도가 빠른 C++로 미리 구현되어 있기 때문입니다.

분에 실시간 비디오 처리처럼 빠른 속도가 필요한 작업에 강합니다.)

광범위한 지원: Windows, Linux, macOS 등 다양한 운영체제와 프로그래밍 언어를 지원합니다.


개발 환경 설정 및 라이브러리 설치

OpenCV 실습을 위해 Anaconda를 사용하여 가상 환경을 설정하고

필요한 라이브러리를 설치하는 과정이 필요합니다. 

Conda 환경 설정 및 설치 

✔️ 가상환경 생성 및 활성화:

conda create --name cv_env python=3.10
conda activate cv_env

 

✔️ 필수 라이브러리 설치:

conda install numpy
conda install matplotlib
conda install opencv

 

🍀 가상 환경을 왜 쓸까요?

내 컴퓨터의 기본 Python 환경을 건드리지 않고, 특정 프로젝트(여기서는 CV_env)에 필요한 라이브러리들만 격리해서 모아두는 방입니다. 이렇게 하면 라이브러리 버전 충돌을 방지하고 환경을 깔끔하게 유지할 수 있습니다.

 

✨ NumPy의 중요성: OpenCV가 이미지를 다룰 때 사용하는 데이터 구조가 바로 NumPy 배열입니다.

따라서 OpenCV를 제대로 활용하려면 NumPy는 필수적으로 설치해야 합니다.


OpenCV 기본 구조 이해: 이미지 데이터와 NumPy

파이썬 환경에서 OpenCV는 이미지를 NumPy의 N-차원 배열 (ndarray) 형태로 처리합니다. 

 

픽셀과 해상도 

• 픽셀 (Pixel): 이미지를 구성하는 가장 작은 단위로, 밝기와 색상 정보를 숫자로 가집니다.

해상도: 이미지의 가로 픽셀 수와 세로 픽셀 수 (예: 1920×1080). 해상도가 높을수록 상세한 이미지를 표현합니다.

 

OpenCV 데이터 구조 

 

이미지유형 차원 픽셀 값 범위 특징
흑백 2차원 (행 x 열) 0 ~ 255 밝기 정보만 가짐. (0: 검은색, 255: 흰색)
컬러 3차원 (행 x 열 x 채널) 0 ~ 255 3개의 채널을 사용. OpenCV는 기본적으로 BGR 순서를 사용하며, 일반적인 RGB 순서와 다름에 주의해야 합니다. (Blue, Green, Red)

🔍 OpenCV가 이미지를 불러오면, 그 이미지는 메모리에서 거대한 숫자 표(NumPy 배열)로 변환됩니다.

컬러 이미지라면 가로, 세로, 그리고 B, G, R 세 개의 층(채널)을 가진 3차원 표가 되는 것입니다.

모든 이미지 처리는 이 숫자 배열을 조작하는 것입니다.

 

⚠️ BGR 순서 유의! 

일반적인 그래픽 프로그램은 RGB (빨강, 초록, 파랑) 순서지만, OpenCV는 BGR (파랑, 초록, 빨강) 순서를 사용합니다.

따라서 색상 정보를 다룰 때 이 순서를 혼동하지 않도록 주의해야 합니다.


기본 이미지 입출력 함수 (I/O) 

OpenCV를 사용한 기본 이미지 처리의 핵심 함수들입니다.

 

기능 함수 설명
읽기 cv2.imread(filepath, flag) 이미지 파일을 불러와 NumPy 배열로 반환. flag로 흑백/컬러 지정 가능.
표시 cv2.imshow(winname, mat) 이미지를 팝업 창에 표시.
저장 cv2.imwrite(filepath, mat) NumPy 배열 형태의 이미지를 파일로 저장.
대기 cv2.waitKey(delay) 키 입력을 대기. delay가 0이면 무한 대기.
창 닫기 cv2.destroyAllWindows() 생성된 모든 이미지 창을 닫음.

 

☀️ 이미지 출력 과정 (예시: basic.py)

• cv2.imread(): 하드 디스크에 있는 이미지 파일을 메모리(NumPy 배열)로 가져옵니다.

cv2.imshow(): 메모리에 있는 배열을 화면에 팝업 창으로 띄웁니다.

cv2.waitKey(0): 창이 즉시 닫히지 않고, 사용자가 키를 누를 때까지 무한정 기다리게 합니다. 이 함수가 없으면 이미지를 보자마자 프로그램이 종료됩니다.

cv2.destroyAllWindows(): 사용자가 키를 누르면 모든 창을 깨끗하게 닫습니다.