Python, Image, NumPy를 이용한 PIL 이미지를 NumPy 배열로 변환하는 방법
Python, Image, NumPy를 이용한 PIL 이미지를 NumPy 배열로 변환하는 방법
딥러닝 모델과 같은 작업을 위해 PIL 이미지를 NumPy 배열로 변환해야 하는 경우가 종종 발생합니다. NumPy 배열은 이미지 데이터를 다루기에 더 효율적이고, 딥러닝 모델에서 사용하기에 더 적합한 형식입니다.
해결 방법:
PIL 이미지를 NumPy 배열로 변환하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 다음과 같습니다.
import numpy as np
# PIL 이미지를 불러옵니다.
image = Image.open("image.png")
# 이미지를 NumPy 배열로 변환합니다.
image_array = np.asarray(image)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
코드 설명:
import numpy as np
명령어를 사용하여 NumPy 라이브러리를 불러옵니다.Image.open("image.png")
함수를 사용하여 PIL 이미지를 불러옵니다.np.asarray(image)
함수를 사용하여 PIL 이미지를 NumPy 배열로 변환합니다.print(image_array)
명령어를 사용하여 변환된 NumPy 배열을 출력합니다.
주의 사항:
- PIL 이미지는 RGB 또는 RGBA 형식으로 저장될 수 있습니다. NumPy 배열로 변환하면 각 픽셀은 3개 또는 4개의 채널(R, G, B, A)로 구성됩니다.
- NumPy 배열의 dtype은 기본적으로
uint8
입니다. 다른 데이터 형식을 원하는 경우np.asarray(image, dtype=np.float32)
와 같이 dtype 매개변수를 지정할 수 있습니다.
다른 방법:
image.convert("RGB")
함수를 사용하여 이미지를 RGB 형식으로 변환한 후np.asarray(image)
함수를 사용하여 NumPy 배열로 변환할 수 있습니다.image.getdata()
함수를 사용하여 이미지 데이터를 튜플 형식으로 가져온 후 NumPy 배열로 변환할 수 있습니다.
참고 자료:
추가 정보:
- PIL 이미지를 NumPy 배열로 변환하는 방법 외에도 NumPy 배열을 PIL 이미지로 변환하는 방법도 있습니다.
Image.fromarray(array)
함수를 사용하면 NumPy 배열을 PIL 이미지로 변환할 수 있습니다.
예시:
import numpy as np
# NumPy 배열을 생성합니다.
array = np.array([[1, 2, 3], [4, 5, 6]])
# NumPy 배열을 PIL 이미지로 변환합니다.
image = Image.fromarray(array)
# 변환된 PIL 이미지를 저장합니다.
image.save("image.png")
이 코드는 NumPy 배열을 "image.png"라는 이름의 PIL 이미지로 저장합니다.
예제 코드
예제 1:
import numpy as np
from PIL import Image
# PIL 이미지를 불러옵니다.
image = Image.open("image.png")
# 이미지를 NumPy 배열로 변환합니다.
image_array = np.asarray(image)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
import numpy as np
from PIL import Image
# PIL 이미지를 RGB 형식으로 변환합니다.
image = image.convert("RGB")
# 이미지를 NumPy 배열로 변환합니다.
image_array = np.asarray(image)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
import numpy as np
from PIL import Image
# PIL 이미지 데이터를 튜플 형식으로 가져옵니다.
image_data = image.getdata()
# 튜플 형식의 데이터를 NumPy 배열로 변환합니다.
image_array = np.array(image_data)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
import numpy as np
from PIL import Image
# NumPy 배열을 생성합니다.
array = np.array([[1, 2, 3], [4, 5, 6]])
# NumPy 배열을 PIL 이미지로 변환합니다.
image = Image.fromarray(array)
# 변환된 PIL 이미지를 저장합니다.
image.save("image.png")
PIL 이미지를 NumPy 배열로 변환하는 대체 방법
tobytes() 함수 사용:
tobytes()
함수는 이미지 데이터를 바이트 문자열로 변환합니다. 이후 np.frombuffer()
함수를 사용하여 바이트 문자열을 NumPy 배열로 변환할 수 있습니다.
import numpy as np
from PIL import Image
# PIL 이미지를 불러옵니다.
image = Image.open("image.png")
# 이미지 데이터를 바이트 문자열로 변환합니다.
image_bytes = image.tobytes()
# 바이트 문자열을 NumPy 배열로 변환합니다.
image_array = np.frombuffer(image_bytes, dtype=np.uint8)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
ImageOps.grayscale() 함수 사용:
ImageOps.grayscale()
함수를 사용하여 이미지를 흑백 이미지로 변환합니다. 흑백 이미지는 3개의 채널(R, G, B) 대신 1개의 채널(L)만 가지므로 NumPy 배열로 변환할 때 메모리를 적게 사용할 수 있습니다.
import numpy as np
from PIL import Image, ImageOps
# PIL 이미지를 불러옵니다.
image = Image.open("image.png")
# 이미지를 흑백 이미지로 변환합니다.
image = ImageOps.grayscale(image)
# 이미지를 NumPy 배열로 변환합니다.
image_array = np.asarray(image)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
skimage.io.imread() 함수 사용:
skimage.io.imread()
함수는 이미지를 NumPy 배열로 변환하는 데 사용할 수 있는 또 다른 라이브러리 함수입니다.
import numpy as np
from skimage import io
# PIL 이미지를 불러옵니다.
image = Image.open("image.png")
# 이미지를 NumPy 배열로 변환합니다.
image_array = io.imread(image)
# 변환된 NumPy 배열을 확인합니다.
print(image_array)
위의 대체 방법들은 각각 장단점을 가지고 있습니다. 사용자의 상황에 맞는 방법을 선택하여 사용할 수 있습니다.
참고:
tobytes()
함수는 이미지 데이터의 모든 정보를 포함하지 않을 수 있습니다.ImageOps.grayscale()
함수는 이미지 색상 정보를 손실시킵니다.skimage.io.imread()
함수는 PIL 라이브러리보다 설치가 더 복잡할 수 있습니다.
python image numpy