Pillow, OpenCV

Nam Eun-Ji·2021년 2월 22일
0

디지털 이미지

이미지를 저장하는 방법

  • 래스터(raster) or 비트맵(bitmap) : 각 점 하나하나의 색상값을 저장하는 방식
  • 벡터(vector) : 상대적인 점과 선의 위치를 방정식으로 기록하여 확대 및 축소에 따라 디지털화면의 각 화소에 어떻게 표현될지를 계산하기에 깨짐이 없음

색을 표현하는 방식(color space)

  • RGB
  • YUV
  • HSV(Hue 색상, Saturation 채도, Value 명도)
  • CMYK




Pillow

파이썬 이미지 처리 라이브러리

새로운 이미지 생성

import numpy as np
from PIL import Image

data = np.zeros([32, 32, 3], dtype=np.unit8)
image = Image.fromarray(data, 'RGB')  # 만들어진 배열을 이미지객체로 변환
image.show()

data[:, :] = [255, 0, 0]
image = Image.fromarray(data, 'RGB')
image.show()

save

import os
from PIL import Image

# 연습용 파일 경로
image_path = os.getenv('HOME')+'/aiffel/python_image_proc/pillow_practice.png'

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

# width와 height 출력
print(image.width)
print(image.height)

# JPG 파일 형식으로 저장해보기
new_image_path = image_path.split('.')
new_image_path[1] = 'jpg'
new_image_path = '.'.join(new_image_path)
image = image.convert('RGB')
image.save(new_image_path)

resize

img_resize = image.resize((100, 200))
resize_image_path = os.getenv('HOME')+'/aiffel/python_image_proc/pillow_practice_resize.png'
img_resize.save(resize_image_path)

crop

img_crop = image.crop((300, 100, 600, 400))
crop_image_path = os.getenv('HOME')+'/aiffel/python_image_proc/pillow_practice_crop.png'
img_crop.save(crop_image_path)



데이터전처리

import os
import pickle

dir_path = os.getenv('HOME')+'/aiffel/python_image_proc/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'>
print(train.keys())  # dict_keys([b'filenames', b'batch_label', b'fine_labels', b'coarse_labels', b'data'])

print(type(train[b'filenames']))  # list
print(train[b'filenames'][0:5])
# [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']

print(train[b'data'][0:5])
# array([[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]], dtype=uint8)

print(train[b'data'][0].shape)  # (3072, )
  • RGB 3채널 x 1024(=32x32) = 3072
  • 위 형태를 (32, 32, 3)으로 reshape하기
  • 이 데이터는 순서대로 첫번째부터 1024까지 R, 그다음 1024는 G, 마지막 1024는 B로 이루어져 있다.
  • 그래서 그냥 모양만 맞추어 reshape하면 안되고, 1024를 32x32에 채우는 것을 3번 반복하는 reshape여야한다.
  • np.reshape(order) : order라는 인자에 F라는 값을 주면 원하는 형태로 진행된다.
image_data = train[b'data'][0].reshape([32,32,3], order='F')
image_data = image_data.swapaxes(0, 1)  # x축, y축 바꿔줌
image = Image.fromarray(image_data)
image.show()





OpenCV

컴퓨터 비전용 라이브러리

  • RGB순서가 아닌 BGR순서 사용
import cv2 as cv
import numpy as np

cap = cv.VideoCapture(0)

while(1):

    # Take each frame
    _, frame = cap.read()

    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

    # define range of blue color in HSV
    # H : 110~130, S&V = 50~255  => blue color 
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors
    # frame영상을 변환한 hsv에다 기준들(lower_blue, upper_blue)을 적용하여,
    # 해당하는 픽셀들에는 1, 아닌 픽셀들에는 0을 찍어놓은 배열을 반환
    # mask 크기 = 400*300(*1)
    mask = cv.inRange(hsv, lower_blue, upper_blue)

    # Bitwise-AND mask and original image
    # 이미지 두장을 받아서 AND 비트 연산을 한다는건데, 이 기능이 필요한게 아니므로,
    # 두 장 다 같은 이미지(frame,frame)를 넣어 결국 동일한 이미지가 나오게 한다.
    # dst가 주어진다면 그 위에, 아니면 새로 빈 검정색 영역 위에 이미지를 만들고 반환
    res = cv.bitwise_and(frame,frame, mask= mask)
    
    cv.imshow('frame',frame)  # 카메라에서 받아온 이미지
    cv.imshow('mask',mask)    # 파란색 영역만 골라낸 마스크
    cv.imshow('res',res)      # 이미지에 마스크를 적용한 결과
    
    # 5초간 키 입력을 감지하고, 키 입력이 특정 키(27번 = ESC)가 되면
    # 처음의 무한 루프(while 1)에서 빠져나오고,
    # 아니라면 다시 위로 돌아가서 카메라를 읽는 부분부터 반복.
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break

cv.destroyAllWindows()
cap.release()
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글