본문 바로가기
Pytorch

[Pytorch] PIL, cv2, pytorch 이미지 처리 library 비교

by pulluper 2022. 4. 11.
반응형

안녕하세요 Pulluper입니다. 😁

이번에는 이미지를 python에서 불러오는 여러 library의 비교를 통해 정리를 해 보겠습니다.  각 library의 자료형이나, size의 구성 shape 등을 다루는데, 헷갈리는 부분이 있어서 정리를 해 보겠습니다. 대상은 PIL, cv2, pytorch입니다. 


1) PIL

 

이 library는 python imaging library의 약자입니다. 

 

- 설치방법 

 

pip install image

 

- 이미지 load / visualization

 

from PIL import Image

# 0. set root
root = './figures'
image_path = os.path.join(root, '000001.jpg')

# 1. load PIL image
img_pil = Image.open(image_path)

# 2. visualize PIL image
img_pil.show()

 

PIL image.show() 를 하면 다음과 같이 이미지가 띄워집니다. 우리가 이미지를 더블 클릭 했을때처럼 기본 연결프로그럄으로 이미지를 띄워줍니다.  

pil image show

- PIL image 속성

 

print(img_pil.size)
print(img_pil.mode)
print(img_pil.bits)

 

는 다음과 같은 결과를 보입니다.

 

(353, 500)
RGB
8

 

즉, PIL 은 size : (w, h) / dtype : uint8, / format : RGB 임을 알 수 있습니다. 

 


2) CV2

 

이 library는 opencv이며, 다양한 computer vision의 알고리즘들이 잘 구현된 library입니다. https://opencv.org/ 에서 더 많은 정보를 얻을 수 있습니다. 

 

Home - OpenCV

OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI).

opencv.org

 

- 설치방법

 

pip install opencv-python

 

- 이미지 load / visualization

 

import cv2

# load cv2 image
img_cv2 = cv2.imread(image_path)

# visualize cv2 image
cv2.imshow('img_cv2', img_cv2)
cv2.waitKey(0)

 

cv2는 구성이 numpy의 ndarray 이고, cv2.imshow() 는 다음과 같이 새 창을 띄워서 이미지를 보여줍니다. cv2.waitKey(0)는 이미지를 계속 띄우라는 명령어 입니다. 

cv2 image vis

 

- cv2 image 속성

 

print(img_cv2.shape)
print(img_cv2.dtype)

 

이것의 결과는 다음과 같습니다. 

 

(500, 353, 3)
uint8

 

자 여기서 보면 cv2 의 shape는 (h, w, c) 입니다. 그리고 cv2는 특이하게 rgb 이미지format이 아니라 bgr입니다. 그리고 기본 data type은 uint8 입니다. 


3) Pytorch

 

사실 pytorch가 위의 두 library처럼 이미지 처리에 특화된 library가 아니지만, 우리가 image data를 이용할 때, PIL 또는 cv2와 연동해서 tensor 로 변경 할 필요가 있습니다. 

 

- PIL을 이용해서 tensor로 변경하기 

 

from PIL import Image
import torchvision.transforms.functional as F

img_pil = Image.open(image_path)
img_tensor = F.to_tensor(img_pil)

 

pil image를 불러온 다음, torchvision의 functional 에서 to_tensor() 함수를 이용해서 tensor로 변경 해 줍니다. 

 

- tensor 속성

 

print(img_tensor.size())
print(img_tensor.shape)
print(img_tensor.dtype)

 

다음 코드의 결과는 다음과 같습니다. 

 

torch.Size([3, 500, 353])
torch.Size([3, 500, 353])
torch.float32

 

이말인 즉슨, tensor의 shape은 (c, h, w) 이고, dtype 은 float32 (0~1)이라는 것 입니다. 

 

- tensor visualization

 

import matplotlib.pyplot as plt
plt.figure('input')
plt.imshow(img_tensor.permute(1, 2, 0))
plt.show()

 

저는 tensor를 visualization 할 때는 보통 matplotlib를 사용합니다. 이때 위 코드에서 permute를 통해서 (c, h, w) 의 shape를 (h, w, c) 로 변경해 주는 부분이 필요합니다.  

 

matplotlib plt.show for tensor


정리 

 

  PIL cv2 tensor(pytorch)
function for size/shape .size .shape .size() / .shape
shape / size (w, h) (h, w, c) (c, h, w)
dtype uint8 uint8 float32
range 0 - 255 0 - 255 0 - 1
format RGB BGR RGB

 

작업을 하다보면 코드마다 사용한 library 가 달라서 어떤 처리를 위하여 이 정보가 필요한 수도 있습니다. 😂 (저는 종종 있었습니다.)


Quiz  위에서 다룬 정보를 이용하면 다음 작업들을 할 수 있게 됩니다. 한번 도전해보세요~😎😎😎

 

1. How to convert PIL to cv2

2. How to convert cv2 to tensor

3. How to convert PIL to tensor

4. 특정 부분을 바꾸기  (cv2 사용)

5. PIL to tensor, cv2 to tensor 같게 만들기

 

감사합니다.
의견과 토론은 항상 환영합니다. 


 

반응형

댓글