Image Data Augmentation_(cv2,PIL)

Date:


Image Data Augmentation




왜 Data Augmentation이 필요할까?

  • image Data의 경우는 실제 Data와 다름
  • 대부분의 Dataset은 특정 시점, 각도에 따라서 한정된 Data를 가지게 됨
  • 이런 부분들 때문에 Training 할 Dataset과 현실속 실제하는 전체 Data와 Gap이 발생하게 됨

image

🔑 Augmentaion 사용하여 Training Dataset과 Real Data사이의 Gap을 줄여줌

image




Augmentation 종류

  • Crop, Affine(Shear), Brightness, Perspective, Rotate 등을 활용하여 Training Dataset 내 Image를 변환하여 Data 수를 늘리는 효과를 줄 수 있음

image




Image handling



CV2

  • 설치 : pip install opencv-python
  • import : import cv2
  • 불러오기 : cv2.imread("image 경로") 형식으로 경로 기반으로 Image를 불러옴
  • 불러온 image는 ndarray타입으로 여러 연산이 가능하고, matplotlib.pyplot 라이브러리를 이용하여 img를 출력할 수 있음
  • image의 사이즈도 numpy의 shape 함수를 활용하여 확인 가능함
  • cv2의 출력은 BGR 순서로 이루어져 있기 때문에, RGB로 변경해야 원본 image를 확인 할 수 있음

📰code

import cv2
import matplotlib.pyplot as plt
img = cv2.imread("cat.png")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

print(type(img),img.shape)
# numpy.ndarray, shape : (height, width, channel)
plt.imshow(img)

🔍result RGB로 변경 시


🔍result BGR로 출력 시, # img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)



Image crop

  • 별도의 함수 필요없이 numpy slicing을 통해 Crop 할 수 있음

📰code

import cv2
import matplotlib.pyplot as plt
img = cv2.imread("cat.png")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img=img[200:700,600:1200,:]
plt.imshow(img)

🔍result



Image save

  • imwrite 함수를 활용해 image를 저장할 수 있음

📰code

import cv2

img = cv2.imread("cat.png")

x, y = 600, 200
dx, dy = 600, 500
crop_img = img[y:y+dy, x:x+dx,:]

cv2.imwrite("crop_img.png", crop_img)

🔍result



cv2 지원 image format

  • Windows bitmap (bmp)
  • Portable image formats (pbm, pgm, ppm)
  • Sun raster (sr, ras)
  • JPEG (jpeg, jpg, jpe)
  • JPEG 2000 (jp2)
  • TIFF files (tiff, tif)
  • Portable network graphics (png)




PIL(Python Imaging Library)

  • 설치 : pip install pillow
  • import : from PIL import Image
  • 불러오기 : Image.open('image 경로')형식으로 경로 기반으로 Image를 불러옴
  • 불러온 image는 PIL.PngImagePlugin.PngImageFile 타입으로 PIL package에 있는 연산으로 접근하거나 조작할 수 있음

📰code

from PIL import Image

img = Image.open('cat.png')
img.show()

🔍result



Image size 확인

📰code

from PIL import Image

img = Image.open('cat.png')
img.size

🔍result

(1280, 960)



Image crop

  • crop 함수를 이용하여 이미지를 잘라낼 수 있음
  • 필요한 좌표는 사각형의 왼쪽 위, 오른쪽 아래 좌표가 필요함
  • [ x1, y1, x2, y2] -> x1, y1 : 좌측 상단 좌표, x2, y2 : 우측 하단 좌표

📰code

from PIL import Image

img = Image.open('cat.png')
crop_img = img.crop([600,200,1200,700])
crop_img.show()

🔍result



Image with drawBox

  • ImageDraw Package를 활용하여 도형을 넣을 수 있음

📰code

from PIL import Image, ImageDraw

img = Image.open('cat.png')

draw = ImageDraw.Draw(img)
draw.rectangle([100,200,800,700], outline="blue", fill = "blue")
display(img)

🔍result



Image to Numpy array

  • image를 ndarray 형태로 바꿀 수 있음
  • numpy로 바꿔서 이후 plt을 통해 image를 그릴수도 있고 여러 image를 합치거나 brightness를 변경할 수 있음
  • cv2도 ndarray형식으로 출력이 나오기 때문에 연산의 자유도가 높아짐

📰code

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

img = Image.open('cat.png')
num_img = np.array(img)
print(type(num_img), num_img.shape)
plt.imshow(num_img)

🔍result



Numpy array to Image (cv2 -> PIL)

  • ndarray에서 PIL형태로 변경할 수 있음
  • cv2가 ndarray형식이기 때문에 CV2 -> PIL 형식으로 변환으로 생각할 수 있음

📰code

import cv2
import matplotlib.pyplot as plt
from PIL import Image
img = cv2.imread("cat.png")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

pil_Image = Image.fromarray(img)
pil_Image.show()

🔍result



Image save

  • image 저장하기

📰code

from PIL import Image

img = Image.open('cat.png')
img.save("저장할이름.jpg")



PIL 지원 image format

지원여부 Image Format
읽기/쓰기 모두 지원 BMP, DIB, EPS, GIF, ICNS, ICO, IM, JPEG, JPEG 2000, MSP, PCX, PNG, PPM, SGI, SPIDER, TGA, TIFF, Webp
읽기만 지원 BLP, CUR, DCX, DDS, FLI, FLC, FPX, FTEX, GBR, GD, IMT, IPTC/NAA, MCIDAS, MIC, MPO, MCD, PIXAR, PSD, WAL, WMF, XPM
쓰기만 지원 PALM, PDF, XV Thumbnails




📌reference


💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡 

댓글