CS/디지털영상처리

[디지털영상처리] Color Image Processing (1)

nowkoes 2024. 1. 23. 14:30

컬러 이미지 처리

개요

출처: 위키피디아

 

 지금까지 이미지 처리를 배우며 대부분 흑백 이미지만 사용하였다. 이는 흑백 이미지가 이미지 처리의 기본 개념을 파악하기 용이하기 때문인데, 컬러 이미지에 비해 데이터 양이 적고 처리 속도가 빠르기 때문이다. 이번 시간에는 색상에 대한 개념부터 컬러 이미지 처리에 대한 전반적인 개념을 배우는 시간을 가지도록 해보자.


본문

색이란?

 

 색(Color)이란 빛의 성질 중 하나로, 빛의 파장 분포에 의해 결정되며 인간의 눈과 뇌에 의해 인식되는 것을 의미한다. 이때 물리적인 특성보다는 시각적 경험에 의존하는 심리적 특성이다. 이때 빛과 색을 혼동하는 경우가 많은데, 일반적으로 빛(Light) 물리적인 에너지의 형태로서 색을 생성하는 물리적인 원인이며, 색은 그 결과로써 인간이 인식하는 현상이다.


색의 모델(1) - RGB

 

 

 컬러 이미지를 다룰 때 자주 사용하는 모델은 크게 3가지가 존재한다. 가장 널리 알려진 RGB(Red, Green, Blue)빛의 가산 혼합(Additive Mixing, 서로 다른 색상의 빛을 겹쳐 새로운 색상을 만드는 것)을 기반으로  한다. 이는 적색, 녹색, 청색의 세 가지 색상을 다양한 비율로 혼합하여 다른 색상을 만드는 것을 의미한다. 이때 각 색상은 일반적으로 0에서 255 사이의 값으로 표현된다. 

 

 

 예를 들어, 위와 같이 하나의 채널을 0으로 고정하고 나머지 채널의 값을 0부터 255까지 차례대로 변화하는 이미지를 만들고 싶다고 가정해 보자. 그렇다면 코드를 어떻게 작성해야 할까?

 

R = zeros(256, 256);
g = 0:255;
G = ones(256, 1) .* g;
B = 255 - G;
B = B';

I = zeros(256, 256, 3);
I(:, :, 1) = R;
I(:, :, 2) = G;
I(:, :, 3) = B;
imshow(uint8(I), []);

 

 위와 같이 zeros와 ones, 매트랩 배열 인덱싱을 통해 적절한 과정을 거치면 된다. 먼저, R = 0일 경우를 고려해 보자. R에는 zeros 함수를 적용, G에는 0부터 255까지의 값을 순차적으로 갖는 배열을 생성하기 위해 ones 함수와 요소별 곱셈을 이용, B는 G를 이용하여 256 by 256 배열을 각각 생성하면 된다.

 

 이러한 RGB 모델은 주로 디스플레이 장치에서 사용된다.


색의 모델(1) - CMY and CMYK

 

 다음은 빛의 감산 혼합(Subtractive Mixing, 색상의 빛을 흡수하고 반사하는 방식)을 기반으로 하는 CMY(Cyan, Magenta, Yellow) 모델이다. 일반적으로 CMY는 시안, 마젠타, 노랑의 세 가지 색상을 사용하며, 각 색상은 특정 파장의 빛을 흡수하고 나머지를 반사한다. 이 모델은 수식에서 알 수 있듯이 RGB 모델의 보색으로 작동하며, 주로 컬러 인쇄에서 중요한 역할을 한다.

 

좌측 그림 출처: brunch.co.kr/@montempsmalta/67

 

 하지만 컬러 인쇄 작업을 수행할 때 검은색을 많이 사용하게 되는데, 이때 CMY 모델 만으로는 잉크 사용량이 많아져 문제가 생긴다. 이러한 단점을 보완하기 위해 CMYK라는 모델이 사용된다. CMYK는 CMY 모델에 키(Key), 즉 검은색을 추가한 모델이다. K 채널은 특히 텍스트 인쇄나 어두운 영역에서 선명도와 대비를 향상하며, 잉크 사용을 최적화한다. 

 

 

 예를 들어, 다음과 같은 이미지가 있다고 가정해 보자. 해당 이미지를 RGB 모델과 CMY모델로 변환하여 첫 번 째 채널만 사용하여 출력하면 차이점을 알 수 있다.

 

I = imread("example_CMYK.jpg");
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
C = 255 - R;
M = 255 - G;
Y = 255 - B;

% case 1. CMY(M = 0, Y = 0)
[m, n, ~] = size(I);
I_cmy = zeros(m,n,3);
I_cmy(:,:,1) = C;

% case 2. RGB(G = 0, B = 0)
I_rgb = zeros(m,n,3);
I_rgb(:,:,1) = R;

subplot(1,2,1); imshow(uint8(I_cmy), []);
subplot(1,2,2); imshow(uint8(I_rgb), []);


색의 모델(3) - HSI(HSV)

 

 

 다음은 색상, 채도, 명도의 세 가지 구성 요소로 색을 나타내는 HSI(Hue, Saturation, Intensity/Brightness) 모델이다. 이때 색상은 다른 색과 구별되는 색을 나타내며, 채도는 색의 강도(혼합 비율), 명도는 색의 밝기를 나타낸다. 즉, 우측의 원뿔 그림에서 H 채널은 중심축을 중심으로 한 각도로 표현되고, S 채널은 중심축에서부터의 거리로, I 채널은 수직축의 위치로 표현된다.

 

 

 

 왼쪽 그림에 있는 사각형은 0부터 1까지 색을 모니터에 출력하기 위해, 사전적으로 정의해 둔 24-bit RGB 큐브다. 해당 도형을 H, S, I 모델로 나타낸 결과를 보면 직관적으로 각 용어들이 어떻게 쓰이고 있는지 이해할 수 있다. 또한 우측의 수식은 RGB에서 HSI로 변환하는 식이다. 

 

I = imread("example_CMYK.jpg");
R = uint8(zeros(size(I))); R(:,:,1) = I(:,:,1);
G = uint8(zeros(size(I))); G(:,:,2) = I(:,:,2);
B = uint8(zeros(size(I))); B(:,:,3) = I(:,:,3);

% case 1. Original Image + R/G/B plane
figure(1);
subplot(2,3,2); imshow(I, []);
subplot(2,3,4); imshow(R, []);
subplot(2,3,5); imshow(G, []);
subplot(2,3,6); imshow(B, []);

% case 2. Original Image + H/S/I plane
figure(2);
hsi = rgb2hsv(I);
subplot(2,3,2); imshow(I, []);
subplot(2,3,4); imshow(hsi(:,:,1), []);
subplot(2,3,5); imshow(hsi(:,:,2), []);
subplot(2,3,6); imshow(hsi(:,:,3), []);

 

 간단하게 앞서 실습했던 이미지를 R/G/B 채널과 H/S/I 채널로 나누어서 비교해 보았다. 

반응형