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

    Matlab의 Image processing toolbox를 사용한다면 imsave 키워드를 이용할 수 있다. 문법도 단순하다.
    우리가 다룬 데이터가 A라는 변수로 저장되어 있다고 하자.
    이 때 이를 현재폴더 내에 aaa.png라는 파일로 저장하고 싶다면,
    imsave(A, 'aaa.png');
    이면 끝이다. 특정한 경로에 저장하고 싶다면 파일명의 자리에 경로를 모두 포함하여 넣어주면 된다.


    하지만 이 명령어를 이용해 저장하면, 이미지가 하얗게, 혹은 거의 하얗게 저장되어 어리둥절할 때가 있다. 

    이 때의 문제는 보통 변수 A의 자료형에 있다. 
    이미지를 처음에 불러올 때 실수범위의 연산을 위하여 double이나 single로 데이터를 불러오기 마련이다. 
    이 데이터를 다시 저장을 한다면, 당연히 그 결과물(A 변수)도 자료형이 double이나 single이다. 
    하지만 컴퓨터의 비트맵형식 이미지는 그 형식이 double이나 single일 수 없다. 비트맵은 정수밖에 모른다.
    매트랩의 자료형을 기준으로, 우리가 일반적인 모니터에서 보는 그림들은 uint8 형식의 8비트 (0-255)정수 데이터 범위를 갖게 된다. 
    물론 12비트나 16비트, 심지어는 32비트의 그림형식도 있지만 특수한 경우가 아니고선 보통 8비트를 이용할 것이다.
    (특수한 경우에 해당될 때는 그냥 Raw 파일로 저장하거나 uint16등으로 16비트로 저장하자)

    그럼 이 문제를 어떻게 해결해야 하는가? 저장하기 전에 해당파일의 형식을 uint8로 바꿔주면 된다. 
    새 변수 B를 만드는데 같은 픽셀 크기이지만 데이터가 8blt이도록 선언한다.
    B=uint8(zeros(size(A));
    B=A;

    그 뒤에 A를 꾸겨넣어주면,8bit로 형변환 된다.


    그럼 double이나 single타입은 아예 저장을 할 수가 없는것인가? 그것은 아니다.

    매트랩에서는 이미지를 저장할 때에 변수의 타입이 double이나 single 타입이면, [0~1]범위안에 Normalized된 실수라고 판단한다.
    즉 8bit로 치면, 값이 0이면 0, 0.5면 128, 1이면 255가 된다.
    그런데 우리가 갖고있는 데이터는 Normalize가 안되어 있므로 모두 하얗게 saturated되는 것이다. 
    이것을 해결하기 위해서는 2차원 이미지 기준으로
    A= A/max(max(A));
    등의 연산을 통해서 이미지 자체를 0에서 1 사이로 Normalize 해 줄 수 있다. 이렇게 해준다면 imsave를 이용하여 저장할 수 있다.



    저작자 표시 비영리
    신고
    Posted by koog 미련퉁이