[파이썬] raw 영상(데이터) 불러오기 및 저장하기 (read raw/write raw)
1. Read raw
Python으로 raw영상을 불러오자.
영상처리쪽 공부를 하게되면 raw파일을 많이 접할 수 있다.
프로그래밍의 첫 번째는 파일 불러오기 ! (이것저것 만져보려면 먼저 파이썬에 영상을 불러와야 한다).
영상(데이터)을 불러오는 것은 여러가지 방법이 있고, 라이브러리도 다양하다.
여기서는 가장 간단한 numpy 라이브러리를 사용해보자.
먼저 numpy를 import 한다.
import numpy as np
open 함수를 이용해서 file을 open하자.
fid=open("경로및파일명.RAW","rb")
여기서, 경로는 역슬러쉬 \ 아니라 슬러쉬 / 를 사용한다.
이제 fromfile을 이용해서 파일을 읽자.
Img=np.fromfile(fid, dtype='int16', sep="")
*참고*
numpy의 데이터 타입(dtype)은 다양하다.
참/거짓을 나타내는 boolean (bool), 정수형(int8, int16, int32, int64), 양의 정수형(uint8, uint16, uint32, uint64)
부동소수형(float16, float32, float64), 복소수형(complex64, complex 128), 그리고 문자형(string_)이 있다.
이렇게 Img라는 변수에 RAW 영상이 불러졌다.
그런데, 이렇게 불러들인 영상은 1차 벡터배열로 저장되었을 것이다 (1 x n의 형태로)
영상의 경우, 2차 행렬(혹은 array)의 형태로 되어 있으므로 재배열을 해줘야한다.
재배열은 numpy의 reshape함수를 사용하자.
Img=np.reshape(Img,[2300, 4000])
여기서, 2300과 4000은 RAW영상의 가로/세로 크기를 나타낸다.
2300과 4000이라는 숫자는 예제로 사용한 것이므로 불러오려는 영상의 크기를 사전에 알아내어서 그 값으로 교체해야 된다
이제 이어서 해보자.
C:\USERS\0000.RAW 라는 파일을 읽어와서 imshow로 display할 것이다.
여기서 0000.RAW 파일은 16비트의 정수형이며, 2000x1500의 픽셀을 가지는 gray scale 영상이라고 한다.
참고로, 영상을 디스플레이 하기 위해서 matplotlib를 사전에 설치한다.
(anaconda prompt에서 activate TEST -> pip install matplotlib 입력, 이전 포스터 참고)
import numpy as np
from matplotlib import pyplot as plt
fid=open('C:/USERS/0000.RAW',"rb")
fid.close()
Img=np.fromfile(fid,dtype='int16', sep="")
Img=np.reshape(Img, [2000,1500])
plt.imshow(Img,cmap='gray', vmin=0, vmax=500)
이제 Img라는 변수에 2차 행렬이 array형태로 저장되었을 것이다.
(외부에서 파일을 불러오거나 저장할 경우, open으로 지정된 변수는 항상 닫아주도록 하자. fid.close()함수를 활용하면 된다)
그리고 영상을 plot하기 위해서 matplotlib의 imshow함수를 사용하였다.
상기 코드를 보면 cmap은 gray이고 영상의 최소, 최대 윈도우 레벨은 0~500으로 설정하였다.
cmap을 다르게 설정하고 싶다면 구글에서 검색하면 다양한 scale들이 있으니 참고하자.
2. Write raw
불러들인 Img라는 영상을 이리저리 처리해서 Img_new 라는 변수가 탄생되었다고 하자 (이후에 영상처리 관련 알고리즘을 소개할 것이다).
이제 Img_new라는 영상을 Result.RAW로 저장하고 싶다.
(실수가 되어서 float32의 dtype을 가지고 파일크기는 [1900, 1400]이 되었다)
먼저, 동일하게 open함수를 이용한다.
fid=open(C:\USERS\Result.RAW, "bw")
이제 numpy의 tofile을 할용한다.
Img_new.tofile(fid)
fid.close()
이상이다. 매우 간단하다 😁
물론, numpy를 import하는 것은 잊지말자.
fid=open(C:\USERS\Result.RAW, "bw")
Img_new.tofile(fid)
fid.close()
오늘의 포스터는 여기까지~
다음에는 영상의 경로나 크기등을 따로 config로 저장하는 법과 시리즈의 영상들을 한번에 불러오는 방법들
(for 문, str() 함수 활용법등)을 포스팅 할 것 같다.