CS/디지털영상처리

[디지털영상처리] 개요

nowkoes 2023. 9. 29. 00:00

Digital Image Processing(DIP)

개요

이미지가 투영되는 과정

 

 디지털 영상 처리(Digital Image Processing, DIP)는 디지털 이미지나 비디오의 시각적 내용을 개선, 분석, 변환하는 기법들을 포함한 기술 영역이다. 즉, DIP는 컴퓨터나 전자 디바이스를 사용하여 이미지 정보를 처리하는 과정을 의미한다. 디지털 영상 처리의 주된 목적은 이미지의 개선, 변형, 복원 등을 하는 것이며, 해당 결과로 다른 이미지나 이미지의 수정된 버전이 출력된다. 즉, 이미지 자체를 개선하거나 변형하는 데 중점을 둔다.

 

 이미지란 무엇일까? 이미지(Image)는 라틴어 이마고(Imago)에서 유래한 것으로, 모방하다는 뜻을 가진 라틴어 이미타리(Imitari)에서 파생한 것이다. 쉽게 얘기해서 대상에 대해 개인이나 집단이 머릿속에 그리는 주관적 그림을 이미지라고 정의한다.

 

이미지를 픽셀 값으로 출력

 

 디지털 영상 처리의 관점에서 이미지란 두 차원의 신호로 간주한다. 즉, 일련의 픽셀을 구성한 그리드 또는 배열로 표현하는 정보를 의미한다. 각 픽셀은 공간 좌표와 해당 위치에서의 밝기 또는 색상 정보를 나타내는 값을 가진다. 

 

 이러한 디지털 이미지를 수학적으로 어떻게 표현할 수 있을까? 이를 수학적으로 생각하면, 2차원의 좌표를 받아 해당 좌표의 픽셀 강도를 실수로 반환하는 함수로 생각할 수 있다. 즉, f(x, y) = i(x, y) * r(x, y) + n(x, y), from R^2 to R로 표현할 수 있다. 

 

  • 0 < f(x, y) < ∞: 밝기(Intensity)
  • 0 < i(x, y) < ∞: 빛
  • 0 < r(x, y) < 1: 반사 계수
  • n(x, y): 노이즈

 

 필자는 영상 처리를 위해 매트랩을 선택하였다. 위에서 알 수 있듯이, 영상 처리는 행렬 연산과 매우 밀접한 관련이 있으며, 매트랩은 이러한 행렬 연산을 강력하게 지원하기 때문에, 영상 처리에 대한 프로그래밍 언어로서 적절하다. 이번 시간에는 이미지를 불러오고, 행렬 연산을 활용하여 간단한 영상 처리를 해보자.

 


본문

example.jpg

 

 다음은 example.jpg라는 이미지를 불러오고 처리하는 코드다.

 

I = imread("example.jpg");
Ig = rgb2gray(I); % Ig = rgb2gray(imread("example.jpg"))

figure(1); subplot(1,2,1); imshow(I, []);
subplot(1,2,2); imshow(Ig, []);

 

 현재 경로에 example.jpg라는 파일을 불러오고, 해당 이미지를 gray scale로 변환한 뒤, 두 사진을 같은 figure에 띄우는 코드다. 매트랩에서는 이미지를 처리하기 전에 먼저 로드를 해야 하는데, 이를 imread() 함수를 이용해 구현할 수 있다.

 

컬러 이미지를 불러온 I와 그레이 스케일 Ig

 

 또한 해당 과목을 공부하는 동안 대부분의 이미지를 rgb2gray() 함수를 이용해 gray scale로 변환하였다. 그레이 스케일 변환의 주된 이유는, 컬러 스케일에 비해 처리하기가 더 간단하기 때문이다. 그레이 스케일은 단 하나의 채널로 정보를 표현하지만, 컬러 이미지는 여러 채널(예: RGB의 3 채널)을 다루어야 한다. 따라서 기본적인 영상 처리 개념을 학습하는 단계에서는 그레이 스케일 이미지가 더 직관적이고 효율적이다.

 

 불러온 이미지를 gray scale로 변환한 뒤, 이미지의 비교를 위해 subplot() 함수를 사용하였다. subplot()은 이미지를 띄울 때, 하나의 그래픽 창 내에 여러 개의 작은 축을 생성해 여러 이미지를 플로팅할 수 있다.

 

 마지막으로 이미지를 출력하기 위해 imshow() 함수를 사용하였다. 이 함수의 첫 번째 인자는 uint8 타입이어야 한다. 두 번째 인자로 주어진 []는 밝기 범위를 자동으로 설정하는 옵션이다. 이에 대한 자세한 내용은 다음 시간에 다뤄보도록 하겠다.

 

Ig_new = Ig.* 2;
figure(2); subplot(1,2,1); imshow(Ig, []);
subplot(1,2,2); imshow(Ig_new, []);

 

 개요 부분에서 이미지는 결국 f(x, y) = r(x, y) * i(x, y) + n(x, y)처럼 함수로 나타낼 수 있다고 하였다. 그렇다면 이 밝기를 조절하려면 해당 함수에 연산을 적용하면 된다. 위의 코드에서는 그레이 스케일 이미지 Ig의 각 요소에 2를 곱해서 두 이미지를 플로팅하였다. 매트랩에서는 행렬을 위한 연산 중 dot operation이 있다. 행렬에 어떤 스칼라를 곱할 때 dot('.')을 붙이면 배열 간 요소별 연산을 수행해 준다.

 

 이때 디지털 이미지는 기본적으로 8bit 단위다. 즉, 0부터 255까지의 값을 가지는데, 흑백 스케일 기준으로 밝기가 작아질수록 어두워지고, 커질수록 밝아진다. 만약 255보다 커지면, 매트랩에서는 overflow가 발생하지 않고 saturation이 발생하므로 255를 출력하게 된다. 따라서 해당 그림은 흰색 부분이 많아진다.


요약

디지털 영상 처리
1. 정의: 디지털 이미지 정보를 처리하는 것
 - 이미지: 일련의 픽셀을 구성한 그리드 또는 배열로 표현하는 정보
2. 목적: 이미지 자체의 개선, 복원, 변형
3. 매트랩
 a. 디지털 영상 처리를 진행할 때 사용하는 언어로서, 행렬 연산에 있어 강력한 장점이 있음
 b. 이미지 로드: imread()
 c. 이미지 출력: imshow();
 d. 스케일 변환: rgb2gray();
반응형