Programming Language/Python

[Python] cv2와 PIL 라이브러리를 활용하여 이미지 다루기

new_challenge 2020. 6. 27. 00:11
반응형

이번 포스팅은 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 로 변환

반응형