이미지 다루기 pillow

김승환·2021년 7월 14일
0

딥러닝공부

목록 보기
2/17

먼저 pillow를 이용하여 이미지를 다룹니다!

  • 이미지 호출
  • 이미지 포멧 변경
  • 특정 이미지 영역 저장

패키지를 먼저 다운 받아 주세요

pip install pillow opencv-python matplotlib

pillow로 이미지를 다루기 위해 아래 이미지를 사용할 것입니다.

이미지 파일은 픽셀로 이루어져 있기 때문에 행렬과 매우 흡사합니다. 예를 들면 224x224 사이즈도 행렬로 따지면 224x224 행렬로 표현할 수 있겠죠? 하지만 사진처럼 색상을 가지고 있는 경우에는 Red, Green, Blue로 특징을 가지고 있기 때문에 파이썬에서 행렬로 표시하면 224x224행렬이 3개로 나누어 표현합니다. 어쨋든 파이썬으로 불러와 보겠습니다.


from PIL import Image
import os

# 사진을 저장한 파일경로
image_path = 'C:/study/pillow_practice.png'

# 이미지 열기
img = Image.open(image_path)
img

이미지 파일이 열렸습니다. 저 이미지는 어떤 행렬을 가졌는지 확인해 보겠습니다!

# 높이 너비 값 출력
print(img.width)
print(img.height)

620
465

그리고 pillow는 PNG를 JPG로 바꿔 저장할 수 있습니다.


# PNG파일을 불러왔지만 JPG로 저장해버리기
new_image_path = 'C:/study/pillow_practice.jpg'
img = img.convert('RGB')
img.save(new_image_path)

이번에는 불러온 이미지의 사이즈를 바꿔보겠습니다!

  • 원래 사이즈가 620x465이었다면 100x200사이즈로 가보겠습니다

#아래 코드를 이용해 사이즈 변경
resized_image = img.resize((100,200))

resized_image_path = 'C:/study/pillow_practice_resized.png'
resized_image.save(resized_image_path)
resized_image

자를 수도 있습니다!
crop 함수를 이용하면 되는데 좌표를 찍는 형식입니다!
(start_x, start_y, start_x + width, start_y + height)
https://sssunho.tistory.com/2

CUT = (300, 100, 600, 400)
region = img.crop(CUT)

cropped_image_path = 'C:/study/pillow_practice_resized.png'
region.save(cropped_image_path)
region

pillow를 이용한 cifar-100데이터 전처리 하기

데이터 다운은 아래에서 하면 됩니다.
[https://www.cs.toronto.edu/~kriz/cifar.html]


#데이터를 먼저 호출합니다!
import os
import pickle
from PIL import Image

dir_path = 'C:/study/cifar-100-python'
train_file_path = os.path.join(dir_path, 'train')

with open(train_file_path, 'rb') as f:
    train = pickle.load(f, encoding='bytes')

print(type(train))

<class 'dict'>

우리는 pillow를 통해 전처리를 할 것이기 때문에 데이터가 어떤 형태로 구성이 되어있는지 파악 해야합니다.

# key를 확인합니다.
train.keys()

dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])

키 값들은 전부 byte형태로 되어있기 때문에 키를 호출할때 b를 붙여주세요!

이제 하나하나 확인해보겠습니다.


# filenames의 타입를 보겠습니다!
print(type(train[b'filenames']))
train[b'filenames'][0:5]

<class 'list'>

[b'bos_taurus_s_000507.png',
b'stegosaurus_s_000125.png',
b'mcintosh_s_000643.png',
b'altar_boy_s_001435.png',
b'cichlid_s_000031.png']

데이터가 저장된 data를 확인해 보겠습니다.

print(train[b'data'][0:5])
print(train[b'data'][0].shape)

[255 255 255 ... 10 59 79]
[255 253 253 ... 253 253 255]
[250 248 247 ... 194 207 228]
[124 131 135 ... 232 236 231]
[ 43 32 87 ... 60 29 37]

data는 3072인 1x3072행태로 구성이 되어있습니다. 그 이유는 32x32 행렬로 3개 RGB인 (32x32x3)행렬을 한줄로 쭉 폈기 때문입니다. data안의 값들 한줄 한줄이 이미지라고 생각하면 됩니다. 그러면 이 값들을 이미지로 볼 수 있는지 없는지 궁금해지는데 당연 가능합니다!

reshape을 통해 한줄짜리 행렬을 32x32x3 행렬로 바꾸고 fromarray로 이미지를 보겠습니다.

image_data = train[b'data'][0].reshape([32, 32, 3], order='F')
image = Image.fromarray(image_data)
image

이미지가 호출된 모습을 볼 수 있습니다. 매우 작아서 알아보기 힘들지만 알아보셔야합니다! ㅎㅎ 자세히 보면 x축 y축이 뒤집혀 출력이 됩니다. 그래서 다시 x축 y축을 뒤집는 과정이 굳이? 필요는 없지만 해보겠습니다.

image_data = image_data.swapaxes(0, 1)
image = Image.fromarray(image_data)
image


그럼 우리는 cifar-100을 행렬 값으로 홈페이지에서 다운로드를 받았는데, 한번에 이미지를 저장하고 싶을 수 있습니다! 그러면 지금 위에서 했던 작업을 잘 합치면 만들 수 있습니다!

import os
import pickle
from PIL import Image
import numpy
from tqdm import tqdm
#일단 train파일이 있는 경로를 설정해줍니다!
dir_path = 'C:/study/cifar-100-python'
train_file_path = os.path.join(dir_path, 'train')

# 행렬을 이미지로 저장할 폴더 위치를 설정합니다! 폴더는 자동으로 만들어 줄 것이기 때문에 직접 폴더 생성하지 마세욥
images_dir_path = 'C:/study/cifar-images' #'cifar-image'라는 폴더를 만들것입니다! study까지는 있어야겠죠?
if not os.path.exists(images_dir_path):
    os.mkdir(images_dir_path)

# 32X32의 이미지 파일 50000개 를 저장해봅시다... 후,,
with open(train_file_path, 'rb') as f:
    train = pickle.load(f, encoding='bytes')
    for i in tqdm(range(len(train[b'filenames']))): #tqdm 이 뭔지 궁금한분 있을 수 있습니다. 그냥 진행상황을 bar로 표시해줄뿐입니다..
        filename = train[b'filenames'][i].decode() #byte로 저장되어있기 때문에 str로 바꿔주는 것입니다.
        data = train[b'data'][i].reshape([32, 32, 3], order='F') #위에서 어떤일을 하는지 알려줬죠? 한줄짜리 행렬을 3개의 32x32행렬로
        image = Image.fromarray(data.swapaxes(0, 1)) #x축 y축이 뒤집혀있기 때문에 다시 뒤집는 작업입니다!
        image.save(os.path.join(images_dir_path, filename)) #저장저장

.

profile
인공지능 파이팅!

0개의 댓글