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

[디지털 영상처리 기초] 10. 컬러 영상처리

by CodingKwon 2021. 6. 29.

[디지털 영상처리 기초] 10. 컬러 영상처리

 

1. Twins 영상을 입력하여 휘도 성분에 깨소금 잡음을 첨가하라. 이는 아래와 같이 처리될 수 있다.

>> ty=rgb2ntsc(tw);
>> tn=imnoise(ty(:,:,1),‘salt & pepper’);
>> ty(:,:,1)=tn;

여기서 디스플레이를 위해 RGB로 다시 변환하라.

 

twins.tif
0.19MB

 

다음은 실습을 위해 휘도 성분에 깨소금 잡음을 첨가 후에 다시 RGB로 변환하는 과정입니다.

 

% Twins 영상 불러오기
tw = imread('twins.tif');
ty = rgb2ntsc(tw);
tn = imnoise(ty(:,:,1),'salt & pepper');
ty(:,:,1)=tn;

% RGB 영상으로 다시 변환
a = ntsc2rgb(ty); 
subplot(1,2,1), imshow(tw); title('Twins 원본')
subplot(1,2,2), imshow(a); title('잡음추가')

 

a라는 변수에 휘도에 깨소금 잡음을 추가한 영상을 넣었습니다.

다음은 다시 RGB로 변환한 결과입니다.

원본과 소금 후추 잡음 추가 영상

 

 

a. 그림 13.16에서와 같이 각 RGB 성분에 적용되어 나타나는 깨소금 잡음과 이 잡음의 모양을 비교하라. 그 차이점을 알 수 있는가?

 

일단 위에서 휘도에 잡음을 추가하였으니 비교를 위해서 RGB 성분에 적용되는 깨소금 잡음을 만들어보겠습니다.

 

% RGB 성분에 적용되는 깨소금잡음 만들기
rgb_twins = imnoise(tw, 'salt & pepper');

 

rgb_twins라는 변수에 RGB 성분에 적용되는 깨소금 잡음을 적용한 영상을 넣었습니다.

 

이제 휘도에 잡음을 추가한 영상과 RGB 성분에 적용되는 깨소금 잡음을 추가한 영상을 비교해보겠습니다.

 

% 휘도에 잡음과 RGB에 잡음 추가를 비교
figure, subplot(1,2,1), imshow(a), title('휘도에 잡음추가')
subplot(1,2,2), imshow(rgb_twins), title('RGB에 잡음추가')

 

다음은 결과입니다.

 

휘도와 RGB에 소금 후추 잡음 추가

 

휘도에 잡음을 추가한 영상에는 검정, 흰색에 소금과 후추 같은 잡음이 추가되었습니다. 하지만 RGB성분에 잡음을 추가한 영상은 잡음의 색이 빨강, 파랑, 초록 잡음이 추가된 것을 볼 수 있습니다.

 

 

 

b. 휘도 성분에 대하여 미디언 필터를 적용하여 잡음을 제거하라.

 

다음은 휘도에 잡음을 넣은 영상을 ntsc로 변환하여 휘도 성분에 미디언 필터를 적용하는 과정입니다.

 

% 휘도성분에 대하여 미디언필터를 적용하여 잡음 제거하기
tnn = rgb2ntsc(a);
tnn(:,:,1) = medfilt2(tnn(:,:,1)); % 미디언 필터 적용
median_a = ntsc2rgb(tnn);
figure, imshow(median_a), title('휘도성분에 미디언필터 적용')

 

다음은 결과 이미지입니다.

 

휘도 성분에 미디언 필터 적용

 

 

c. 각 RGB 성분들에 미디언 필터를 적용하라.

 

다음은 각 RGB 성분에 미디언 필터를 적용한 과정입니다.

 

% 각 RGB 성분에 미디언필터를 적용하기
tn_r = medfilt2(a(:,:,1)); % R 성분 미디언필터 적용
tn_g = medfilt2(a(:,:,2)); % G 성분 미디언필터 적용
tn_b = medfilt2(a(:,:,3)); % B 성분 미디언필터 적용
rgb_median_a = cat(3, tn_r, tn_g, tn_b); % RGB 합치기
figure, imshow(rgb_median_a), title('RGB 성분에 미디언필터 적용')

 

RGB 성분에 미디언필터 적용

깨끗하게 잡음이 제거된 결과를 확인할 수 있습니다.

 

 

 

d. 어느 것이 최적의 결과를 주는가?

 

휘도에서 미디언필터를 적용한 것보다 각 RGB성분에 미디언필터를 적용한 결과가 더 좋은 결과가 나왔습니다. 저는 이유로 각 RGB성분에서 미디언필터를 적용하는 것은 각 성분별로 잡음이 제거되지만 YIQ에서는 RGB와 YIQ변환 과정에서 잡음이 전체적으로 퍼지기 때문에 제대로 된 제거를 못한 것이라고 생각합니다.

 

 

 

e. 많은 양의 잡음을 실험하라

 

다음은 잡음의 값을 0.5로 증가시켜서 영상에 넣어보겠습니다.

 

% 많은 양의 잡음으로 실험
ty2 = rgb2ntsc(tw); % YIQ로 변환
tn2 = imnoise(ty2(:,:,1),'salt & pepper', 0.5); % 휘도 성분에 잡음 추가
ty2(:,:,1)=tn2;

alotof_noise_a = ntsc2rgb(ty2); % 휘도 성분에 잡음 추가 (RGB 영상으로 변환)
alotof_noise_rgb_twins = imnoise(tw, 'salt & pepper', 0.5); % RGB 성분에 잡음 추가

 

alotof_noise_a는 휘도 성분에 잡음을 0.5로 증가시켜 넣은 변수입니다.

alotof_noise_rgb_twins는 RGB 성분에 잡음을 0.5로 증가시켜 넣은 변수입니다.

 

다음 과정으로 다시 alotof_noise_a를 ntsc로 바꾸어 휘도 성분에 미디언 필터를 적용하고 다시 rgb로 바꿉니다.

 

% 휘도성분에 미디언 필터 적용 과정
tnn2 = rgb2ntsc(alotof_noise_a);
tnn2(:,:,1) = medfilt2(tnn2(:,:,1)); % 미디언 필터 적용
median_a2 = ntsc2rgb(tnn2); % 휘도 성분에 미디언 필터 적용

 

median_a2는 휘도 성분에 미디언 필터를 적용한 변수입니다.

 

다음은 각 RGB성분에 미디언 필터를 적용하는 과정입니다.

 

% 각 RGB성분에 미디언 필터 적용 과정
tn2_r = medfilt2(alotof_noise_rgb_twins(:,:,1)); % R 성분 미디언 필터 적용
tn2_g = medfilt2(alotof_noise_rgb_twins(:,:,2)); % G 성분 미디언필터 적용
tn2_b = medfilt2(alotof_noise_rgb_twins(:,:,3)); % B 성분 미디언필터 적용
rgb_median_a2 = cat(3, tn2_r, tn2_g, tn2_b); % RGB 합치기

 

rgb_median_a2에 각 RGB성분에 미디언 필터를 적용한 값을 합쳐서 넣었습니다.

 

이제 결과를 확인해보겠습니다.

 

% 결과 확인
figure, subplot(2,2,1), imshow(alotof_noise_a); title('휘도에 잡음추가')
subplot(2,2,2), imshow(alotof_noise_rgb_twins); title('RGB에 잡음추가')
subplot(2,2,3), imshow(median_a2); title('휘도성분에 미디언필터 적용')
subplot(2,2,4), imshow(rgb_median_a2); title('RGB 성분에 미디언필터 적용')

 

잡음 추가 영상과 미디언 필터 적용 영상 비교

많은 양의 잡음으로 실험한 결과 휘도 성분에 미디언 필터를 적용한 결과와 각 RGB성분에 미디언 필터를 적용했을 때 결과 둘 다 영상의 잡음을 모두 제거하진 못한 것을 볼 수 있습니다. 또한 영상의 품질도 매우 안 좋습니다. 미디언 필터의 특성상 근처 값들을 활용하기 때문에 잡음이 너무 많아 제대로 제거가 되지 않은 것 같습니다. 다음은 psnr을 통해서 비교해보겠습니다.

 

% pnsr 비교
psnr(uint8(median_a2), tw)
psnr(uint8(rgb_median_a2), tw)

 

휘도, RGB 성분에 미디언 필터 적용 PSNR

육안으로는 둘 다 비슷한 품질의 영상이지만 pnsr로 원본 영상과 비교해보았을 때는 각 RGB성분에 미디언 필터를 적용한 것이 품질이 좀 더 좋습니다.

 

 

 

f. 가우시안 잡음으로 실험하라.

 

다음은 가우시안 잡음을 휘도 성분과 각 RGB성분에 넣어보았습니다.

 

% 가우시안 잡음으로 실험
ty2_ga = rgb2ntsc(tw); % YIQ로 변환
tn2_ga = imnoise(ty2_ga(:,:,1),'gaussian'); % 휘도 성분에 잡음 추가
ty2_ga(:,:,1)=tn2_ga;

alotof_noise_a_ga = ntsc2rgb(ty2_ga); % 휘도 성분에 잡음 추가 (RGB 영상으로 변환)
alotof_noise_rgb_twins_ga = imnoise(tw, 'gaussian'); % RGB 성분에 잡음 추가

 

다음은 가우시안 잡음을 휘도 성분에 넣은 영상을 다시 ntsc로 변환하여 미디언 필터를 적용하고 RGB영상으로 바꾸었습니다.

 

% 휘도 성분에 미디언 필터 적용 과정
tnn2_ga = rgb2ntsc(alotof_noise_a_ga);
tnn2_ga(:,:,1) = medfilt2(tnn2_ga(:,:,1)); % 미디언 필터 적용
median_a2_ga = ntsc2rgb(tnn2_ga); % 휘도 성분에 미디언 필터 적용

 

median_a2_ga 변수에 영상을 담았습니다.

 

다음은 가우시안 잡음을 넣은 영상의 각 RGB성분에 미디언 필터를 적용시켰습니다.

 

% 각 RGB성분에 미디언 필터 적용 과정
tn2_ga_r = medfilt2(alotof_noise_rgb_twins_ga(:,:,1)); % R 성분 미디언 필터 적용
tn2_ga_g = medfilt2(alotof_noise_rgb_twins_ga(:,:,2)); % G 성분 미디언필터 적용
tn2_ga_b = medfilt2(alotof_noise_rgb_twins_ga(:,:,3)); % B 성분 미디언필터 적용
rgb_median_a2_ga = cat(3, tn2_ga_r, tn2_ga_g, tn2_ga_b); % RGB 합치기

 

이를 합친 영상을 rgb_median_a2_ga 변수에 담았습니다.

 

다음은 결과를 확인해보겠습니다.

 

% 결과 확인
figure, subplot(2,2,1), imshow(alotof_noise_a_ga); title('휘도에 잡음추가')
subplot(2,2,2), imshow(alotof_noise_rgb_twins_ga); title('RGB에 잡음추가')
subplot(2,2,3), imshow(median_a2_ga); title('휘도성분에 미디언필터 적용')
subplot(2,2,4), imshow(rgb_median_a2_ga); title('RGB 성분에 미디언필터 적용')

 

휘도, RGB 성분에 미디언 필터 적용 비교 영상

 

정규분포를 가지는 잡음인 가우시안 잡음을 넣은 결과 잡음이 골고루 분포하고 있습니다. 또한 휘도 성분에 미디언 필터를 적용한 결과와 각 RGB성분에 미디언 필터를 적용한 결과 잡음이 어느 정도 제거되었지만 여전히 남아 있는 것을 확인할 수 있습니다. 이는 가우시안 잡음을 많이 주지 않아도 미디언 필터가 주변 값을 이용해서 결과를 만들기 때문에 일정하게 퍼져있는 가우시안 잡음은 완전히 제거할 수 없는 것 같습니다.

 

다음은 psnr로 잡음이 있는 영상과 원본 영상을 비교해보겠습니다.

 

% pnsr 비교
psnr(uint8(median_a2_ga), tw)
psnr(uint8(rgb_median_a2_ga), tw)

 

다음은 결과를 확인해보겠습니다.

 

휘도, RGB 성분에 미디언필터 PNSR

이번에도 각 RGB성분에 미디언 필터를 적용한 것이 PSNR이 더 높게 나타났습니다.

 

댓글