python을 이용한 이미지 처리 - pillow
본문 바로가기
PYTHON/기본 문법

python을 이용한 이미지 처리 - pillow

by 공돌이삼촌 2023. 5. 31.
반응형

 

이미지 좌표를 표현하는 방식은 아래와 같이 

왼쪽 상단이 0.0으로 시작하여

 

먼저 pillow 라이브러를 다운을 받아보자

!pip install pillow

PIL로 부터 Image를 받아오면 된다.

# 대소문자 주의
import os
from PIL import Image
print(os.getcwd())
img_path = './sample_image.jpg'
img = Image.open(img_path)

img를 살펴보면 type은 객체이며, size 를 tuple 형식으로 받을 수 있다.

 

 

show() 함수는 화면에 이미지를 띄워서 보여줍니다.

img_path = './sample_image.jpg'
img = Image.open(img_path)
img.show()

resize

img_path = './sample_image.jpg'
img = Image.open(img_path)

# 이미지 객체에서만 동작합니다.
w, h = img.size  
rs_img = img.resize((h, w))
rs_img.show()

<결과>

 

이미지 대칭 함수

transpose()

flipped_img = img.transpose('대칭 또는 대칭 옵션')

이미지 좌우 대칭: Image.FLIP_LEFT_RIGHT
이미지 상하 대칭: Image.FLIP_TOP_BOTTO

flip_lr_img = img.transpose(Image.FLIP_LEFT_RIGHT)
flip_lr_img.show()

flip_tb_img = img.transpose(Image.FLIP_TOP_BOTTOM)
flip_tb_img.show()

이미지 회전 함수

rotate()

img.rotate(반시계 방향으로 회전할 각도)

이미지를 반시계방향으로 회전합니다
90, 180, 270이 아닌 각도로 회전하여 발생하는 여백에 대해서는 검은색으로 채워집니다.
원본 이미지의 범위를 벗어나는 부분은 삭제됩니다

 

이미지 객체 저장 함수

save()

import os

save_path = os.path.dirname(img_path) + '/fixed_img.jpg'
rot_img = img.rotate(45.6)
rot_img.save(save_path)  # 이미지 객체를 전달한 경로로 저장

도형 덧그리기 함수

from PIL import Image, ImageDraw

# img == 이미지 객체
draw = ImageDraw.Draw(img)

# 선 그리기
draw.line(선의 양 끝 좌표, fill=색상, width=선 굵기)

 선의 양 끝점 좌표. 두 가지 형태가 가능: [x1, y1, x2, y2] 혹은 [(x1, y1), (x2, y2)]
 좌표를 리스트가 아닌 튜플로 전달해도 됨. (x1, y1, x2, y2) 혹은 ((x1, y1), (x2, y2)) 도 가능
 선의 색상. 두 가지 형태가 가능: “red”, “blue” 등의 색 명칭 혹은 (R, G, B) 색상 값
 (R, G, B) 색상 값은 튜플로 전달해야함.
선 굵기의 단위는 픽셀

from PIL import Image, ImageDraw

w, h = img.size

img = Image.open(img_path)

draw = ImageDraw.Draw(img)
# RGB 값으로
draw.line([0, 0, w, h], fill=(255, 0, 0), width=5)
draw.line([w, 0, 0, h], fill=(255, 0, 0), width=5)

사각형을 그리고 싶다면

draw.rectangle(왼쪽위&오른쪽 아래 꼭지점 좌표, fill=채우기 색상, outline=외곽선 색상, width=외곽선 두께)

# 좌표 값: 왼쪽 위 좌표가 (x1, y1), 오른쪽 아래 좌표가 (x2, y2)라면 [x1, y1, x2, y2] 혹은 [(x1, y1), (x2, y2)] 값을 전달하면 됩니다.
# fill: 색상 이름 문자열 or (R, G, B) or None  # None값으로 지정하거나, 명시하지 않으면 채우기 없음
# outline: fill과 동일

# 이미지를 9분할 하여 가운데 부분을 검게 칠하는 예제

img = Image.open(img_path)

w, h = img.size
xy = (w // 3, h // 3, (w * 2) // 3, (h * 2) // 3)

draw = ImageDraw.Draw(img)
draw.rectangle(xy, fill='black')

img.show()

원형을 그리고 싶다면

draw.ellipse(원과 외접하는 사각형의 좌표, fill=채우기 색상, outline=외곽선 색상, width=외곽선 두께)

# draw.ellipse는 원과 외접하는 사각형의 좌표를 통해 원을 표현합니다.
# [x1, y1, x2, y2] 혹은 [(x1, y1), (x2, y2)] 값을 전달하면 됩니다.
# fill: 색상 이름 문자열 or (R, G, B) or None  # None값으로 지정하거나, 명시하지 않으면 채우기 없음
# outline: fill과 동일

img = Image.open(img_path)
w, h = img.size

draw = ImageDraw.Draw(img)
xy = [200, 200, 770, 500]
draw.ellipse(xy, outline=(0, 255, 0), width=5)

img.show()

 

 

이미지 관련 라이브러

albumentations

 

- 도큐먼트: https://albumentations.ai/docs/getting_started/installation/ 
- 데모: https://demo.albumentations.ai/

 

먼저 아래와 같이 라이브러리 설치를 하고

!pip install -U albumentations
!pip install pillow
!pip install opencv-python
!pip install matplotlib

아래와 같이 cv2를 import 하여

새로운 이미지를 text로 받아와 처리할 수 있다.

import albumentations as A
from PIL import Image
import cv2
image = cv2.imread("sample_image.jpg")
transform = A.Compose([
    A.RandomCrop(width=256, height=256),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.CLAHE(always_apply=False, p=1.0, clip_limit=(30, 100), tile_grid_size=(73, 65))

])
transformed = transform(image=image)
transformed_image = transformed["image"]
from matplotlib import pyplot as plt
plt.imshow(transformed_image)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글