CS/디지털영상처리

[디지털영상처리] Resolution

nowkoes 2023. 10. 3. 00:00

해상도 조절

개요

 

 해상도(Resolution)는 다양한 디지털 장치나 미디어에서 세부 사항을 얼마나 정확하게 표현할 수 있는지를 나타내는 척도다. 해상도는 주로 공간 해상도와 강도 해상도로 분류되는데, 공간(Spatial) 해상도이미지의 세부 정보를 얼마나 정밀하게 표현할 수 있는지를 나타내는 척도다. 주로 이미지의 픽셀 차원, 즉 이미지의 너비와 높이를 기반으로 단위 inch 당 픽셀로(dpi) 정의된다. 연속적인 이미지 신호를 디지털 형식으로 변환하기 위해 일정 간격으로 샘플을 취하는 샘플링(Sampling) 빈도가 높아지면 공간 해상도가 높아진다는 특징이 있다.

 

 

 반면 강도(Intensity) 해상도이미지의 각 픽셀에서 표현할 수 있는 밝기 또는 색상의 레벨 수를 나타낸다. 이를 이미지의 비트 깊이 또는 픽셀당 비트 수(bpp)로 표현하며, 이미지의 색상 또는 밝기의 미세한 변화를 얼마나 정확하게 구별할 수 있는지를 나타내는 척도다. 연속적인 신호 값을 제한된 수의 이산 값으로 변환하는 양자화(Quantization) 레벨의 수가 강도를 결정한다는 특징이 있다.

 

 이번 시간에는 각각의 방법을 이용해 해상도를 조절해 보는 시간을 가지도록 해보겠다.


본문

Spatial Resoultion

 공간 해상도를 조절하려면 일반적으로 이미지의 크기를 조절하면 된다. 이 외에도 이미지에 블러를 추가하는 블러링, 고유한 좌표 시스템에서 이미지를 다시 샘플링하여 해상도를 변환하는 좌표 변환 등이 있지만, 이번 시간에는 이미지의 크기만 조절해 보도록 하겠다. 

 

원본 이미지(좌)와 사이즈를 늘린 이미지(우). 출처: 나무위키

 

 본격적으로 resolution을 적용하기 전에, 이미지의 크기를 조절하면 해상도가 조절되는 원리에 대해 알아보자. 이를 이해하려면 디지털 이미지의 본질과 해상도의 정의에 대해 살펴보아야 한다. 앞서 <개요> 게시글에서 알아봤듯이 디지털 이미지는 픽셀로 구성된 그리드다. 각 픽셀은 이미지의 특정 위치에서 밝기나 색상 값을 나타낸다. 그리고 공간 해상도는 단위 면적당 픽셀의 수를 나타낸다.

 

 따라서 이미지를 확대할 땐, 원본 이미지의 픽셀 사이에 새로운 픽셀들이 추가된다. 이 새로운 픽셀들의 값은 주변 픽셀 값들을 바탕으로 보간(Interpolation)되어, 결과적으로 이미지의 크기는 커지지만 실제로 새로운 세부 정보가 추가되지 않아 상대적으로 흐리게 보이는 것이다. 

 

 반대로 이미지를 축소할 땐, 여러 픽셀들이 하나의 픽셀로 합쳐진다. 이때 사용되는 알고리즘에 따라 평균, 중앙값 등의 방식으로 픽셀 값을 결정한다. 이미지의 크기가 줄어들면서 불필요한 세부 정보나 노이즈가 사라지므로, 상대적으로 선명하게 보이는 것이다. 

 

  결론적으로, 이미지의 크기를 조절하면 그에 따라 픽셀의 수와 분포가 변화하게 되므로, 공간 해상도가 변화한다. 이미지의 크기를 늘리면 그만큼 픽셀의 수도 증가하여 공간 해상도가 높아지지만, 실제 세부 정보의 품질은 보간에 따라 약간 변화할 수 있다. 반면 이미지의 크기를 줄이면, 픽셀의 수가 감소하여 공간 해상도가 낮아지지만, 상대적으로 선명하게 보인다. 여기서 주의해야 할 것은 공간 해상도가 커진다고 반드시 해상도가 개선된다는 것은 아니라는 점이다.

 

 이제 이미지의 크기를 조절해보록 하자.

 

Ig = rgb2gray(imread("kamen.jpg"));
Ig_new = imresize(Ig, 2);

출처:&nbsp;https://kr.mathworks.com/help/matlab/ref/imresize.html?s_tid=srchtitle_site_search_1_imresize

 

 먼저 같은 디렉터리 내의 이미지를 불러오고, 이미지의 공간 해상도를 조절하기 위해 imresize() 함수를 사용한다. imresize() 함수는 이미지의 공간 해상도를 조절하는 함수로서 이미지의 크기를 scaling해주는 함수다.

 

figure(1);
imshow(Ig, []);
title("Original Image");

figure(2);
imshow(Ig_new, []);
title("Resized Image");

 

 우리의 목표는 이미지의 크기를 늘렸을 때 원본 이미지와 크기가 조절된 이미지를 비교하는 것이다. 그런데 미세한 흐림을 관찰할 순 있지만, 이러한 화질 차이를 평가할 지표가 없으므로 각 픽셀들의 평균값을 계산하여 출력해 보았다.

 

fprintf('Original Image mean intensity: %.2f\n', mean(Ig(:)));
fprintf('Resized Image mean intensity: %.2f\n.', mean(Ig_new(:)));

 

 놀랍게도 두 이미지 사이의 픽셀 값 평균은 거의 차이가 나지 않는다. 이러한 현상은 imresize() 함수의 작동 원리, 해상도와 선명함의 용어 혼동 때문이다. 해당 함수는 이미지를 확대하거나 축소할 때 보간 알고리즘을 사용하여 주변 픽셀 값들을 기반으로 새로운 픽셀 값을 결정한다. 따라서 이 보간 과정 중에 픽셀 값들의 전반적인 평균은 크게 변하지 않는다.  

 

 또한 해상도는 이미지에 포함된 픽셀의 수를 의미하므로, 이미지의 크기를 늘렸을 때 보간법 등으로 총 픽셀의 개수가 많아지므로 고해상도가 된다. 하지만 이렇게 생성된 고해상도 이미지가 반드시 원본보다 선명하다는 것을 의미하지 않는다. 즉, 해상도의 증가는 선명도의 향상을 보장하지 않으며, 때로는 이미지의 흐림이나 왜곡을 야기할 수 있다.

 

출처:&nbsp;https://en.wikipedia.org/wiki/Gradient

 

 그렇다면 이러한 선명도 차이를 가시적으로 확인하는 방법은 없을까? 이미지의 선명도나 품질을 평가하는 지표를 살펴보니 스칼라 함수의 기울기와 방향을 나타내는 벡터그래디언트(Gradient)가 이러한 특성을 잘 나타낸다고 한다. 그래디언트의 크기는 이미지의 특정 위치에서의 색상 또는 강도의 변화를 나타낸다. 이는 그래디언트의 정의와 연산 방식 때문인데, 이에 대한 내용이 궁금하다면 아래 접은 글을 확인하자

더보기

미분은 함수의 변화율을 나타낸다. 즉, 어떤 함수가 주어진 지점에서 얼마나 빠르게 변하는지를 측정한다. 그리고 그래디언트는 특정 위치에서의 미분으로 정의되며, 픽셀 간의 변화를 측정하는 지표다. 이 개념을 이미지 2D 함수에 적용해 보자. 이 함수는 (x, y) 위치에서의 픽셀 강도 또는 색상 값을 반환한다. 따라서 이 함수의 그래디언트는 x와 y 방향 각각에서의 미분으로 구성된다. 이를 수식으로 나타내면 다음과 같다.

 

 

그래디언트의 x 방향 성분은 픽셀 값이 x 방향으로 얼마나 빠르게 변하는지를 나타낸다. 마찬가지로 y 방향 성분은 y 방향으로의 변화를 나타낸다. 그래디언트의 크기는 이 두 성분을 벡터로 결합하여 계산되며, 다음과 같이 정의된다. 

 

 

결국 이미지의 한 지점에서 인접한 픽셀 간의 밝기나 색상 값이 크게 변화하면, 해당 위치에서의 그래디언트 값도 크게 된다. 선명도는 결국 이미지 내에서 밝기나 색상이 빠르게 변화하는 지점, 즉 경계가 텍스처가 잘 구별되는 것을 의미하게 된다. 따라서 그래디언트가 클수록 이미지가 선명하고, 작을수록 이미지가 흐리다고 할 수 있다.

 

[gradientX, gradientY] = gradient(double(Ig));
[gradientX_new, gradientY_new] = gradient(double(Ig_new));
meanGradientOriginal = mean(sqrt(gradientX.^2 + gradientY.^2), 'all');
meanGradientResized = mean(sqrt(gradientX_new.^2 + gradientY_new.^2), 'all');

fprintf('Original Image mean gradient: %.2f\n', meanGradientOriginal);
fprintf('Resized Image mean gradient: %.2f\n', meanGradientResized);

 

 

 이를 이용하여 각 이미지의 그래디언트 크기를 계산하면 원본 이미지와 Resized 된 이미지의 크기 차이를 관찰할 수 있다. 이를 토대로 이미지의 크기를 반으로 줄여보면, 원본보다 향상된 그래디언트를 얻을 수 있을 것이라고 예측할 수 있다.


Intensity Resoultion

 강도 해상도를 나타내는 가장 일반적인 방법인 비트 해상도에 대해 알아보자. 비트 해상도디지털 이미지의 픽셀 당 할당된 비트의 수를 나타낸다. 이는 각 픽셀이 표현할 수 있는 강도 또는 색상 레벨의 범위, 즉 강도 해상도를 결정한다. 따라서 비트 수가 늘어날수록, 표현할 수 있는 색상의 범위가 넓어지므로 상대적으로 개선된 해상도를 볼 수 있다. 이를 통해 이미지 내의 세부 사항과 색상의 미세한 차이를 구별할 수 있다. 

 

 비트 해상도는 이미지의 해상도나 크기를 나타내는 공간 해상도와 달리, 이미지의 각 픽셀이 사용하는 비트의 수를 나타낸다. 이는 파일 크기에 직접적으로 영향을 미치는데, 이를 수식으로 나타내면 다음과 같다.

 

 

 여기서 b는 이미지의 크기를 나타내고, n은 각 픽셀 당 비트 수, M과 N은 이미지의 행과 열의 수를 나타낸다. 예를 들어 8비트 1920 * 1080인 경우, 1920 * 1080 * 8 = 49,766,400 bits = 5.9326 Mbytes가 된다. 물론 이미지 형식이나 압축률, 메타데이터 등에 의해 변동될 순 있다.

 

 해당 조절이 적용되는 과정은 다음과 같다.

 

  1. 조절할 비트 수 n을 결정
  2. 각 픽셀 값을 분류할 기준 k를 계산
  3. 원래 이미지의 픽셀 값에 해당하는 범위를 찾기 위해 각 픽셀 값을 k로 나눔
  4. k로 나눈 값에 각 범위의 시작 값을 다시 곱함

 

 

 해당 그림만으로는 잘 이해가 되지 않을 것이다. 이를 코드로 구현하여 좀 더 세부적으로 알아보자.

 

Ig = rgb2gray(imread("kamen.jpg"));

nbit = 2;

 

  비트 해상도를 2로 설정하여 이미지의 강도 해상도를 4단계(2^nbit = 2^2 = 4)로 제한한다고 가정해 보자. 디지털 이미지는 통상적으로 0부터 255까지의 값을 가진다. 

 

k = 256/2^(nbit);
Igb_tmp = floor(double(Ig) / k);

원본 값(0~255, 좌)들이 0에서 3사이(우)로 매핑되었음

 

 4개의 레벨로 해당 픽셀을 표현하려고 하기 때문에, 이 값의 범위인 256에 강도 범위 k로 나누면 64라는 간격을 얻게 된다. 이를 원본 이미지 픽셀 값에 k를 나눠주면 0부터 3까지 4가지 범위를 갖게 된다. 

 

Igb = uint8(Igb_tmp * k);

원본(좌), 0~3 매핑(중간), 0, 64, 128, 192 매핑(우)

 

 0, 1, 2, 3 이 네 개의 값으로는 해상도를 표현하기엔, 크기가 너무 작기 때문에 분류 기준 k를 곱해주어 매핑을 해줘야 한다. 이렇게 되면 해당 픽셀 값이 어느 범위에 속하는지 쉽게 알 수 있다. 물론 imshow() 함수의 [] 인자를 통해 자동으로 매핑하면 해결되긴 한다(...)

 

Ig = rgb2gray(imread("kamen.jpg"));

nbit = 2;
k = 256/2^(nbit);
Igb_tmp = floor(double(Ig) / k);
Igb = uint8(Igb_tmp * k);

figure(1);
imshow(Ig);

figure(2);
imshow(Igb_tmp);

figure(3);
imshow(Igb);


요약

해상도
1. 정의: 디지털 장치나 미디어에서 세부 사항을 얼마나 정확하게 표현할 수 있는지를 나타내는 척도
2. 해상도 조절
 a. 공간 해상도 
  - 정의: 이미지의 세부 정보를 얼마나 정밀하게 표현할 수 있는지를 나타내는 척도
  - 특징: 이미지의 크기를 조절하면 픽셀의 값이 변화함
  - 매트랩에서는 이를 위해 imresize() 함수를 제공
 b. 강도 해상도
  - 정의: 이미지의 각 픽셀에서 표현할 수 있는 밝기 또는 색상의 레벨 수
  - 특징: 비트의 수가 파일의 크기에 영향을 미침
  - 비트 해상도: 표현하고자 하는 비트의 수를 이용해 밝기를 매핑하는 것

주의: 해상도와 화질을 혼동하지 말 것
반응형