앞선글 [MATLAB 영상처리 기초 7] 이미지의 화질개선 Contrast-Brightness-Gamma - part1
에서는 주로 이미지의 brightness 개선에 주목 했다면 본 글에서는 contrast 개선을 다루겠습니다.
앞서 언급했듯이 brightness와 contrast 는 긴밀한 관계이지만 선형적인 상관관계를 갖지 않습니다.
따라서 앞의 글에서 예제 이미지의 brightness를 개선 했어도 contrast 또한 어느정도 개선이 이루어진
것입니다.
이번에도 위의 예제 이미지의 gray scale 이미지를 바탕으로 contrast stretching 을 통해
contrast 개선에 주목하겠습니다.
첫 번째로 이미지 픽셀값의 normalization을 통한 contrast stretching 입니다.
" [MATLAB 영상처리 기초 5] 이미지의 화질개선 - Normalization, Standardization " 에서 다룬
Min-Max Normalization의 식은 다음과 같지만,
% X: pixel, Xmax: max value of pixel, Xmin: min value of pixel
% min_max_scaling = (X - Xmin) ./ (Xmax - Xmin);
이번에는 살짝 다른 normalization 식을 이용해 보겠습니다.
각 파라메터를 소개하자면,
a: 이미지 데이터 타입의 최소값. 예를들어 uint8 타입의 최소값은 0, 최대값은 255
b: 이미지 데이터 타입의 최대값
c: 이미지 픽셀의 최소값
d: 이미지 픽셀의 최대값
Pin: 입력 이미지 픽셀값
Pout: 변환 결과
간단한 normalization 식이기 때문에 MATLAB 코드 또한 간단하게 작성할 수 있습니다.
입력 이미지 "img_gray" 는 최소값 0, 최대값 1을 갖는 double 타입의 데이터 입니다.
( 코드에 쓰인 예제 이미지는 본 블로그 맨밑 출처 1에 가셔서 다운로드 받을 수 있습니다. )
img = imread('NCI-jdfn7Z03Qa4.jpg');
img_gray = rgb2gray(img); % convert from RGB to grayscale image data
img_gray = im2double(img_gray); % convert from uint8 to double type data
a = 0; % minimum limit
b = 1; % maximum limit
c = min(img_gray(:)); % minimum pixel of image
d = max(img_gray(:)); % maximum pixel of image
img_gray_result = (img_gray - c) .* ((b-a)./(d-c)) + a;
figure; montage({img_gray,img_gray_result});
figure;
subplot(1,2,1); imhist(img_gray); title('\fontsize{20}Input image');
subplot(1,2,2); imhist(img_gray_result); title('\fontsize{20}Contrast stretching by normalization');
위 결과 이미지(우측)에서 볼 수 있듯이 왼측의 입력 이미지에 비해 contrast 개선이 이루어 졌음을
알 수 있고, 왼편의 입력 이미지의 histogram은 낮은 픽셀값 영역에 몰려 있는 반면 오른편의 histogram은
픽셀값 0.8 까지 확대되어 있음을 볼 수 있습니다.
Contrast stretching의 두번째 방법으로 stretchlim( ) 함수의 연산결과를 imadjust( ) 의 입력 파라메터
로써 적용하는 것입니다.
앞선글 " [MATLAB 영상처리 기초 7] 이미지의 화질개선 Contrast-Brightness-Gamma - part1 " 에서
소개한 imadjust( ) 명령어의 입력 파라메터 중
% J = imadjust(I,[low_in high_in],[low_out high_out],gamma)
stretchlim( ) 함수가 입력 이미지의 [low_in high_in] 을 연산하는 역할을 합니다.
% lowhigh = stretchlim(I, Tol);
% stretchlim(I,[0.05, 0.95]); % an example
stretchlim( ) 명령어의 기본 설정으로써 입력 이미지 픽셀값의 하위 1%, 상위 1% 를 각각
[low_in high_in] 으로 연산하지만, 위 코드의 예와 같이 직접 값을 지정할 수 있습니다(하위 5%, 상위 5%)
이제는 stretchlim( ) 을 이용한 contrast stretching 결과를 보겠습니다.
위 결과 이미지의 우측과 같이 normalization 방식에 비해 contrast stretching이 더 많이 이루어진것을
알 수 있습니다. 여기에서는 stretchlim( ) 함수의 입력 파라메터로써 입력 이미지 픽셀값 하위 5%,
상위 5% 범위를 지정하였습니다. Histogram 결과에서도 보듯이 contrast stretching 이 폭 넓게 적용된
것을 볼 수 있습니다. 이와같이 normalization 방식에 비해 stretchlim( ) 명령어를 이용한 방식이 좀 더
편리할수 있지만 어느 방식이든 절대적으로 더 나은 방법은 없습니다.
img_gray_result2 = imadjust(img_gray, stretchlim(img_gray,[0.05, 0.95]),[0 1]);
figure; montage({img_gray,img_gray_result2});
figure;
subplot(1,2,1); imhist(img_gray); title('\fontsize{20}Input image');
subplot(1,2,2); imhist(img_gray_result2); title('\fontsize{20}Contrast stretching using stretchlim()');
contrast stretching은 위에서 소개한 두가지 방법외에도 다양한 알고리즘들이 존재합니다.
예를들어 Digital Image Processing by Gonzalez, Woods et al., 에서 소개하는 log를 이용한
contrast stretching이 그것입니다. 밑의 그래프와 같이 입력 영상 r에 대해 그래프의 기울기를 조절함에
따라 좁은 범위의 입력 픽셀값 영역(그래프의 x축)을 넓은 범위의 픽셀값 영역(y축)으로 확장할 수 있습니다.
앞서 언급한대로 contrast를 개선하기 위한 방법은 많이 존재하며 어느 한가지 방법만이 최선의
결과를 구해주지 않습니다. 다만 입력 이미지 데이터에 따른 적절한 contrast 개선 알고리즘을 적용
하는것이 중요합니다.
마지막으로 본 글에 쓰인 모든 MATLAB 코드는 밑에 표시해 두었습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
img_gray = rgb2gray(img); % convert from RGB to grayscale image data
img_gray = im2double(img_gray); % convert from uint8 to double type data
a = 0; % minimum limit
b = 1; % maximum limit
c = min(img_gray(:)); % minimum pixel of image
d = max(img_gray(:)); % maximum pixel of image
img_gray_result = (img_gray - c) .* ((b-a)./(d-c)) + a;
figure; montage({img_gray,img_gray_result});
figure;
subplot(1,2,1); imhist(img_gray); title('\fontsize{20}Input image');
subplot(1,2,2); imhist(img_gray_result); title('\fontsize{20}Contrast stretching by normalization');
img_gray_result2 = imadjust(img_gray, stretchlim(img_gray,[0.05, 0.95]),[0 1]);
figure; montage({img_gray,img_gray_result2});
figure;
subplot(1,2,1); imhist(img_gray); title('\fontsize{20}Input image');
subplot(1,2,2); imhist(img_gray_result2); title('\fontsize{20}Contrast stretching using stretchlim()');
출처1: https://unsplash.com/photos/jdfn7Z03Qa4
사진 작가: National Cancer Institute, Unsplash
Cells from cervical cancer – Splash에서 National Cancer Institute의 이 사진 다운로드
unsplash.com
출처2: https://www.nzfaruqui.com/contrast-stretching-in-image-processing-using-matlab/
Contrast Stretching in Image Processing using Matlab - Nuruzzaman Faruqui
Contrast stretching is also known as normalization. It is a simple image enhancement technique. The quality of image is enhanced by stretching the range of intensity values. To perform the stretching, we have to specify the upper and lower pixel value limi
www.nzfaruqui.com