PIL 이미지 불러오기 + numpy, tensor로 형변환하기
python을 사용할 때 이미지와 관련해서는 주로 사용하는 몇가지 라이브러리가 있다.
그 중에서 보편적이고 기본적인 PIL을 사용하는데 딥러닝 학습에서 주로 사용하는 numpy, tensor에 맞게 자유롭게 포멧을 변형하는 방법을 포스팅하고자 한다.
다운로드
pip install pillow
이미지 열기
import PIL
#(사용하고자하는 이미지변수) = PIL.Image.open('이미지위치')
img = PIL.Image.open('./images/image.jpg')
이미지 불러오기 -> 형변환
1. 이미지 -> numpy
이미지를 불러온 다음 numpy형태로 변환한다.
import numpy as np
from PIL import Image
img = Image.open("이미지주소/불러올사진.jpg")
img_np_array = np.array(img)
#크기확인
print(img_np_array.shape)
다른 방법으로는 asarray() 함수를 사용 가능하다.
import numpy as np
from PIL import Image
img = Image.open("이미지주소/불러올사진.jpg")
Image_np_array = np.asarray(img)
#크기확인
print(Img_np_array.shape)
그러면 여기서 asarray와 array의 차이점은 뭐지?
이 둘은 기본적으로 수행하는 역할은 동일하다. 하지만 array의 copy 옵션은 default는 true이고 asarray의 copy 옵션은 default가 false이다. 즉 array는 개체의 복사본을 만드는 반면 asarray는 형변환이 필요한 경우가 아니라면 만들지 않는다.
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
array는 복사를 한 후에 사용을 하기때문에 원본에주는 영향이 없다.
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
하지만 asarray는 필요한 경우가 아니라면 복사를 하지않고 사용하기 때문에 원본이 변화한다
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
2. Image -> tensor
import torchvision.transforms as transforms
from PIL import Image
PIL_tensor = transforms.ToTensor()
PIL_Image = Image.open("이미지 위치/이미지.png")
Image_tensor = PIL_tensor(PIL_Image)
#확인
print(type(Image_tensor))
>>> class 'torch.Tensor'
numpy or tensor 에서 이미지 출력
1. Tensor -> image(PIL)
import torchvision.transforms as transforms
tensor = torch.tensor([[1,2,3,...]
[2,3,4,...]
... ])
tensor_PIL = transforms.ToPILImage()
image = tensor_PIL(tensor)
#확인
print(type(image))
>>> class'PIL.Image.Image'
2. Numpy -> image(PIL)
from PIL import Image
numpy_array = np.array([[1,2,..],
[2,3,...],
[...]])
numpy_PIL = Image.fromarray(np.uint8(numpy_array))
#확인
print(type(numpy_PIL))
>>> class 'PIL.Image.Image'