본문 바로가기
디지털영상처리기초/Matlab

[디지털 영상처리 기초] 4. 영상 디스플레이 2

by CodingKwon 2021. 6. 21.

[디지털 영상처리 기초] 4. 영상 디스플레이 2

 

1. 카메라맨(256*256) 영상을 각각 128*128과 64*64 크기의 유효 해상도를 가지는 영상으로 해상도를 변환하고 원본 영상과 PSNR을 비교하시오.
– imresize함수의 옵션: nearest, bilinear, bicubic 모두에 대해서 비교.
– 함수 PSNR의 수식을 보고 그 크기가 갖는 의미에 대해서 설명하세요.

 

 

% 카메라맨 이미지 불러오기

c = imread('cameraman.tif');

 

% cameraman의 유효 해상도를 128x128로 변경 (nearest 방식)

c2_n = imresize(imresize(c, 1/2, 'nearest'), 2, 'nearest');

 

% cameraman의 유효 해상도를 64x64로 변경 (nearest 방식)

c4_n = imresize(imresize(c, 1/4, 'nearest'), 4, 'nearest');

 

% cameraman의 유효 해상도를 128x128로 변경 (bilinear 방식)

c2_l = imresize(imresize(c, 1/2, 'bilinear'), 2, 'bilinear');

 

% cameraman의 유효 해상도를 64x64로 변경 (bilinear 방식)

c4_l = imresize(imresize(c, 1/4, 'bilinear'), 4, 'bilinear');

 

% cameraman의 유효 해상도를 128x128로 변경 (bicubic 방식)

c2_c = imresize(imresize(c, 1/2, 'bicubic'), 2, 'bicubic');

 

% cameraman의 유효 해상도를 64x64로 변경 (bicubic 방식)

c4_c = imresize(imresize(c, 1/4, 'bicubic'), 4, 'bicubic');

 

peaksnr1 = psnr(c, c2_n) % nearest 128x128

peaksnr2 = psnr(c, c4_n) % nearest 64x64

peaksnr3 = psnr(c, c2_l) % bilinear 128x128

peaksnr4 = psnr(c, c4_l) % bilinear 64x64

peaksnr5 = psnr(c, c2_c) % bicubic 128x128

peaksnr6 = psnr(c, c4_c) % bicubic 64x64

 

영상의 해상도 변화 방식에 따른 psnr

 

⑴ imresize함수의 옵션: nearest, bilinear, bicubic 모두에 대해서 비교.

nearest : 1/2일 때 psnr은 22.37, 1/4일 때 psnr은 19.50이 나왔습니다.
bilinear : 1/2일 때 psnr은 24.70, 1/4일 때 psnr은 21.82이 나왔습니다.
bicubic : 1/2일 때 psnr은 26.33, 1/4일 때 psnr은 22.68이 나왔습니다.
따라서  유효 해상도를 낮출수록 psnr은 낮아지는 것을 확인헀습니다. 또한 nearest방식보다는 bilinear방식이 psnr이 높고, bilinear방식보다 bicubic방식이 psnr이 더 높게 나타났습니다. 따라서 bicubic > bilinear > nearest 순으로 영상의 품질이 좋다고 볼 수 있습니다.

⑵ 함수 PSNR의 수식을 보고 그 크기가 갖는 의미에 대해서 설명하세요.
 
PSNR=10log₁₀(peakval²/MSE)

PSNR : 최대 신호 대 잡음비(Peak Signal-to-Noise Ratio)
Peakval : 픽셀의 최대 값으로 한 비트당 표현을 2⁸, 즉 0~255로 표현한다면 Peakval은 255가 됩니다. peakval²은 peakval에서 제곱을 한 값입니다.
MSE : Mean Square Error (평균 제곱 오차)입니다. 즉. 원본 영상과 데이터 손실이 있는 영상 간 픽셀 대 픽셀의 차이 값을 제곱 합을 평균 낸 것입니다.

평균 제곱 오차 (MSE)


즉 PSNR이란 높을수록 영상의 품질이 좋다고 생각됩니다. 이유는 Peakval은 값이 고정되어 있기 때문에 MSE에 따라 PSNR값이 변할 것입니다. MSE는 분모에 위치하고 있는데 MSE가 높을수록 영상에 잡음이 많다는 뜻입니다. 따라서 MSE가 높아지면 PSNR의 분모가 커지게 되고 PSNR이 낮아집니다. 즉, PSNR이 낮아질수록 영상의 품질도 낮아진다고 볼 수 있습니다. 그렇다면 MSE가 낮아지면 영상의 잡음이 적다는 뜻이며 PSNR은 높아지게 됩니다.

 

2. 256x256 카메라맨 영상의 양자화를 64와 8의 그레이 스케일로 변환하고 양자화에 의해 발생하는 현상에 대해 설명하시오.

 

c = imread("cameraman.tif"); % cameraman을 c에 선언

c1 = uint8(floor(double(c)/4)*4); % 64의 그레이스케일로 양자화

c2 = uint8(floor(double(c)/32)*32); % 8의 그레이스케일로 양자화

 

length(unique(c1)) % 64의 그레이스케일로 양자화 한 것 분석

length(unique(c2)) % 8의 그레이스케일로 양자화 한 것 분석

 

양자화 한 결과

subplot(1,3,1), imshow(c), title('원본')

subplot(1,3,2), imshow(c1), title('64로 양자화')

subplot(1,3,3), imshow(c2), title('8로 양자화')

 

양자화 결과 비교

 

64의 그레이스케일 양자화에서는 원본과 크게 차이를 느끼지 못했지만 8의 그레이스케일 양자화에서는 이상한 영역들이 보입니다. 이를 false contour라고 합니다. 양자화는 한 화소를 몇 개의 비트로 표현하는지를 나타냅니다. 그레이스케일의 수를 줄일수록 연속적인 그레이스케일 사이에 불연속이 더 커져 false contour(거짓 윤곽선)가 생기게 됩니다.

 

3. 카메라맨 영상을 밝기 128을 기준으로 이진영상으로 만들고 디더링 행렬 D2를 사용하여 halftoning을 적용하여 이진영상과 비교하시오.

 

% 카메라맨 영상을 128기준으로 이진영상으로 변환

c = imread("cameraman.tif"); % cameraman을 불러옵니다

c1 = c >128;  % 값을 128보다 크면 1 작으면 0으로 이진영상으로 만듦

 

% D2 디더링

D2 = [0 128 32 160; 192 62 224 96; 48 176 16 144; 240 112 208 80];

r = repmat(D2, 64, 64);

c2 = c>r;

 

% 비교하기

subplot(1,2,1), imshow(c1), title('이진영상')

subplot(1,2,2), imshow(c2), title('halftoning')

 

이진영상, halftoning영상

 

이처럼 결과를 보았을 때 이진영상의 경우 원본과 다르게 false contour에 의해 영상이 많이 훼손된 모습을 볼 수 있습니다. 하지 halftoning으로 만든 영상은 이진영상과 같은 크기의 영상이지만 화소의 위치를 섞음으로 눈속임을 통해서 false contour를 제거하여 원본과 비슷한 영상을 재현하고 있습니다.

댓글