안녕하세요.^^ 비스카이비전의 심교훈입니다. 오늘은 그레이스케일 이미지를 다음과 같이 특정 컬러맵을 가진 RGB 이미지로 멋지게 표현하는 방식에 대해서 알아보도록 하겠습니다.
그레이 영상을 컬러로 나타내는 것이 어떻게 가능할까요? 물론 촬영당시 장면의 실제 색을 나타내는 것은 불가능합니다. 한 픽셀당 Red, Green, Blue 각각 8비트, 총 24비트가 필요한데, 이미 그레이 영상으로 변환되면서 8비트만 남았기 때문입니다. 8비트는 256개(2의 8승)의 밝기를 나타낼 수 있습니다. 8비트 그레이 영상은 256개의 밝기로 영상을 나타낸 것입니다. 그레이 영상의 256개의 밝기를 256개의 컬러로 사상(mapping)해준다면 어떻게 될까요? 그러면 컬러 이미지로 전환이 가능해지겠죠? 이것을 해주는 함수는 바로 ind2rgb 입니다. ind2rgb 함수를 사용하면 그레이스케일 영상을 특정 컬러맵의 영상으로 전환해줄 수 있습니다.
자, 그렇다면 이제 어떻게 MATLAB을 이용해서 코딩하면 되는지 살펴보겠습니다. 단 한 줄이면 됩니다.
>> 출력된 RGB 이미지 = ind2rgb(그레이 스케일 이미지, colormap(특정 컬러맵))
그레이 스케일 이미지를 입력해주면서, 어떤 컬러맵으로 변환해줄 것인지 선택만 해주면 됩니다. 위 결과를 만들어낸 코드는 다음과 같습니다.
clc, clear, close all
img = imread('gray.bmp');
summer_RGB = ind2rgb(img, colormap(summer));
imshow(summer_RGB)
parula_RGB = ind2rgb(img, colormap(parula));
figure, imshow(parula_RGB)
spring_RGB = ind2rgb(img, colormap(spring));
figure, imshow(spring_RGB)
hot_RGB = ind2rgb(img, colormap(hot));
figure, imshow(hot_RGB)
jet_RGB = ind2rgb(img, colormap(jet));
figure, imshow(jet_RGB)
사실 ind2rgb 함수의 역할은 음이 아닌 정수로 구성된 M x N 사이즈의 행렬을 RGB로 전환해주는 것입니다. 그런데 만일 정수값(0~255)이 아니라 소수들(0~1)로 구성된 M x N 사이즈의 행렬을 RGB로 전환해주고 싶다면 어떻게 해야할까요? 이때는 ind2rgb 함수를 사용할 수 없습니다. 대신 grs2rgb 함수를 사용할 수 있습니다. 이 함수는 MATLAB 내장 함수가 아니라 조지타운 대학교의 Valeriy R. Korostyshevskiy가 2006년에 개발한 함수입니다. 따라서 이 함수를 사용하시고 싶으신 분은 아래 링크에서 다운받아서 사용하시길 바랍니다.^^
=> https://kr.mathworks.com/matlabcentral/fileexchange/13312-grayscale-to-rgb-converter
사용법은 역시 간단합니다.
>> 출력된 RGB 이미지 = grs2rgb(그레이 스케일 이미지, colormap(특정 컬러맵))
위의 ind2rgb가 grs2rgb로 바뀐 것 외에는 전혀 변동 사항이 없습니다.
그렇다면, 언제 ind2rgb 함수 또는 grs2rgb 함수를 사용하면 좋을까요? 제 사견으로는 픽셀의 세기가 중요도 또는 활성화도 또는 강도를 나타내는 그레이스케일 이미지인 경우에 이 기술을 사용하면, 훨씬 더 인상적으로 이미지를 표현할 수 있습니다. 예를 들어, 이미지 내에서 시각적으로 중요한 영역, 즉 사람의 시선이 가는 곳을 예측하는 visual saliency(VS) 알고리즘으로 얻은 그레이스케일 VS 맵을 grs2rgb를 사용해서 컬러로 표현하면 훨씬 더 보기 좋게 표현할 수 있습니다. 아래 예시의 VS 맵은 GBVS라는 VS 알고리즘을 통해 얻었습니다. GBVS에 대한 설명과 소스코드는 예전에 쓴 포스팅을 참고하세요.^^
GBVS로 산출해낸 VS map은 8비트 그레이 스케일 이미지인데, 오른쪽과 같이 jet 컬러맵으로 매핑해서 표현하니 훨씬 더 멋지죠? 뜨거운 색일수록 중요한 부분인 것이고, 차가운 색일수록 덜 중요한 부분인 것입니다.
오늘은 ind2rgb와 grs2rgb 두 함수를 소개했습니다. 도움이 되신 분들은 공감과 댓글을 아낌없이 남겨주시길 부탁드리며 이상으로 이 글을 마치도록 하겠습니다.^^
'Dev > matlab' 카테고리의 다른 글
[MATLAB] 이미지 크기 조정하기, imresize 함수 (0) | 2020.05.29 |
---|---|
[MATLAB] 숫자와 문자의 조합으로 구성된 문자열에서 숫자와 문자를 각각 추출하려면? (질문에 대한 답변) (2) | 2020.05.22 |
[MATLAB] 영상 좌우 반전, 상하 반전, 회전하기, fliplr, flipud, rot90 함수 (1) | 2019.12.17 |
[MATLAB] inline 함수 활용하기 (0) | 2019.12.16 |
[MATLAB] 반올림, 올림, 내림, round, ceil, floor 함수 (0) | 2019.11.09 |
[MATLAB] 숫자가 아닌 것 찾기, isnan 함수 (0) | 2019.11.08 |
[MATLAB] 비선형 회귀, nlinfit함수와 nlpredci함수 (7) | 2019.11.06 |
[MATLAB] 로그스케일 그래프 그리기, semilogy, semilogx, loglog 함수 (0) | 2019.10.23 |