[Python] cv2와 PIL 라이브러리를 활용하여 이미지 다루기
이번 포스팅은 cv2와 PIL 라이브러리를 활용하여
이미지를 다루는 예제입니다.
PIL 라이브러리
install Library
$ pip install Pillow
> Pillow 라이브러리 설치
Library import
from PIL import Image
> Pillow 라이브러리 import
Image 파일 읽기
from PIL import Image
Image.open("test.jpg")
> 로컬에 test.jpg 파일이 존재한다고 가정. 없다면 test.jpg 파일을 생성한 뒤 실행
Image size 확인
from PIL import Image
img = Image.open("test.jpg")
img.size
> PIL로 읽은 이미지 파일의 크기는 Image.size로 확인이 가능하다
> 출력은 (width, height)의 튜플 형태로 출력
Image crop
from PIL import Image
image = Image.open("test.jpg")
crop_img = image.crop([x1,y1,x3,y3])
# x1, y1 : 죄측 상단 좌표
# x3, y3 : 우측 하단 좌표
> 이미지를 원하는 박스로 자르고 싶을 경우 Image.crop 함수를 사용
> argument로는 좌측 상단과 우측 하단 좌표를 준다
// Original
// Crop
Image with drawBox
from PIL import Image, ImageDraw
im = Image.open("test3.jpg")
draw = ImageDraw.Draw(im)
draw.rectangle([13, 267, 118, 365], outline="red")
draw.rectangle([13, 45, 239, 364], outline="blue")
display(im)
> 이미지 위에 원하는 좌표의 박스를 그릴 경우 ImageDraw.Draw.rectangle 함수를 사용
> ImageDraw.Draw.rectangle의 인자로는 박스의 좌표를 준다
Image to Numpy array
import numpy as np
from PIL import Image
img = Image.open("test.jpg")
num_img = np.array(img)
# num_img : numpy.ndarray
print(num_img.shape)
# h, w, c
> PIL image를 Numpy로 변환하기 위해서는 numpy의 array를 활용한다.
> 그럼 PIL Image를 Numpy로 타입 변환이 가능함
> Numpy로 변환된 이미지의 shape을 확인하면 (height, width, channel) 형태로 출력된다.
Image save
from PIL import Image
img = Image.open("test.jpg")
img.save("저장할이름.jpg")
> 이미지를 저장할 때는 image의 save 함수를 사용
cv2 라이브러리
Install Library
$ pip install opencv-python
> opencv 라이브러리 다운로드
Import Library
import cv2
> cv2 라이브러리 임포트
image read
import cv2
img = cv2.imread("test.jpg")
print(type(img))
# numpy.ndarray
print(img.shape)
# 출력은 (height, width, channel)
> cv2 라이브러리로 이미지를 읽을 경우, cv2.imread 함수를 사용
> cv2로 이미지를 읽을 경우 numpy.ndarray 타입으로 읽는다.
> 이미지의 shape을 확인하면 (height, width, channel) 형태의 3 dim으로 출력된다.
cv2 image crop
import cv2
img = cv2.imread("test.jpg")
crop_img = img[y:y+h, x:x+w] = img[y1:y3, x1:x3]
# 자르고 싶은 왼쪽 상단 포인트를 x,y로 두고, 그 포인트에서 width, height 만큼 원하는 박스 크기 지정
# 같은 의미로 좌측 상단의 좌표와, 우측 하단의 좌표를 지정
print(crop_img.shape)
# 출력은 위에서 지정한 (h, w, c)
> 자르고 싶은 왼쪽 상단 포인트를 x, y로 두고, 그 포인트에서 width, height 만큼 원하는 박스 크기 지정
> 같은 의미로 좌측 상단의 좌표와, 우측 하단의 좌표를 지정
cv2 to PIL image
from cv2
from PIL import Image
img = cv2.imread("test.jpg")
# img : numpy.ndarray type
pil_Image = Image.fromarray(img)
# pil_Image :PIL.Image.Image
> cv2로 읽어드린 이미지는 numpy 타입으로, cv2 이미지를 PIL 이미지로 변경하기 위해서는 Image.fromarray 사용하여 변환.
cv2 Image save
import cv2
img = cv2.open("test.jpg")
x, y = 300, 100
w, h = 300, 500
crop_img = img[y:y+h, x:x+w]
cv2.imwrite("crop_img.jpg", crop_img)
> 이미지 저장에는 cv2.imwrite를 사용한다.
Matplotlib
Install Library
pip install matplotlib
> matplotlib 라이브러리 설치
Import Library
import matplotlib.pyplot as plt
> matplotlib 라이브러리 임포트,
Using matplotlib
import matplotlib.pyplot as plt
# cv2 Image (=Numpy Image)
cv2_img = cv2.imread("test.jpg")
plt.imshow(cv2_img) # numpy이미지 확인
# PIL > Numpy Image
pil_img = Image.open("test.jpg")
num_img = np.array(pil_img)
plt.imshow(num_img)
> Numpy 타입의 이미지를 보기 위해 matplotlib 라이브러리를 사용한다.
> cv2 이미지의 경우 plt.imshow를 사용해서 바로 확인 가능
> PIL 이미지는 numpy로 변환 후, plt.imshow를 사용하여 확인 가능
> 위에서 cv2 이미지를 보여줄 때 색상이 다른 이유는, cv2 라이브러리가 기본적으로 BGR로 이미지를 읽기 때문
> 이미지를 원본 색상으로 보기 위해서는 BGR > RGB로 변환하는 작업이 필요함
cv2.cvtColor([numpy이미지파일], cv2.COLOR_BGR2RGB) # BGR > RGB
> 위 함수를 사용하여 이미지를 BGR > RGB 로 변환