1 분 소요

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'