상세 컨텐츠

본문 제목

매트랩 이미지 저장법, 저장한 이미지가 하얗게 나올때 - imsave, uint8, double

취미 : IT

by 미련퉁이 2015. 10. 23. 03:59

본문

반응형

 

매트랩에서는 이미지를 2차원 행렬로 간주한다. 
이미지를 불러들여온 뒤, 원하는 조작을 한다면, 아마도 그 결과를 저장해야 할 것이다. 
이때 그 형식을 *.mat 파일이나 *.fig 등으로 저장을 할 수도 있지만, 그닥 결과의 데이터가 중요하지 않고 한번 보고하고 끝날 것 같다면, 바로 그림파일 형식으로 저장하는 경우도 많다. 이 때 찾게 되는 명령어가 imsave 일 것이다. 
Matlab의 Image processing toolbox를 사용한다면 imsave 키워드를 이용할 수 있다. 문법도 단순하다.

 

우리가 다룬 데이터가 A라는 변수로 저장되어 있다고 하자.
이 때 이를 현재폴더 내에 aaa.png라는 파일로 저장하고 싶다면,

 

imsave(A, 'aaa.png');
이면 끝이다. 특정한 경로에 저장하고 싶다면 파일명의 자리에 경로를 모두 포함하여 넣어주면 된다.

 

하지만 이 명령어를 이용해 저장하면, 이미지가 하얗게, 혹은 거의 하얗게 저장되어 어리둥절할 때가 있다. 
이 때의 문제는 보통 변수 A의 자료형에 있다. 

 

이미지를 처음에 불러올 때 실수범위의 연산을 위하여 double이나 single로 데이터를 불러오기 마련이다. 
이 데이터를 다시 저장을 한다면, 당연히 그 결과물(A 변수)도 자료형이 double이나 single이다. 
하지만 컴퓨터의 비트맵(Bitmap, BMP)형식 이미지는 그 형식이 double이나 single일 수 없다. 비트맵은 정수밖에 모른다.

 

매트랩의 자료형을 기준으로, 우리가 일반적인 모니터에서 보는 그림들은 uint8 형식의 8비트 (0-255)정수 데이터 범위를 갖게 된다. (대부분의 모니터가 물리적으로 8비트밖에 표현을 못한다.)

 

물론 rawdata를 다루다보면 12비트나 16비트, 심지어는 32비트의 그림형식도 있지만 특수한 경우에 해당될 때는 그냥 Raw 파일로 저장하거나 uint16등으로 16비트로 저장하자. 
그럼 이 문제를 어떻게 해결해야 하는가? 저장하기 전에 해당파일의 형식을 uint8로 바꿔주면 된다. 
새 변수 B를 만드는데 같은 픽셀 크기이지만 데이터가 8bit이도록 선언한다.
B=uint8(zeros(size(A));
그 뒤에 A를 꾸겨넣어주면,8bit로 형변환 된다.

 

B=A;
그럼 double이나 single타입은 아예 저장을 할 수가 없는 것인가? 그것은 아니다.
매트랩에서는 이미지를 저장할 때에 변수의 타입이 floating point(double이나 single 타입)이면, [0~1]범위안에 Normalized된 실수라고 판단하고 0~1 범위를 8bit 범위에 해당하도록 스케일링한다. 
즉, 값이 0--> 0, 0.5 --> 128, 1 --> 255 이런식으로 저장된다.
그런데 만약 우리가 연산을 막 끝낸 floating point 이미지를 저장하려고 한다면, 이미지에서 값이 0~1 범위만 0~255에 해당하게 스케일링 되어 저장되고 1 이상의 값은 모두 최대값인 255로 저장된다. 그래서 대부분의 영상이 하얗게(255) 보이게 된다.
이것을 해결하기 위해서는 2차원 이미지 기준으로
A= A/max(max(A));
등의 연산을 통해서 이미지 자체를 0에서 1 사이로 Normalize 해 줄 수 있다. 이렇게 해준다면 imsave를 이용하여 바로 저장할 수 있다. 

 

반응형

관련글 더보기

댓글 영역