FUNDAMENTAL | 12. 파이썬으로 이미지 파일 다루기(Pillow, OpenCV)

yeonk·2021년 10월 5일
0

aiffel-ai-bootcamp

목록 보기
25/38
post-thumbnail

20210929



1. 디지털 이미지


화소(pixel): 색상을 가진 화면을 구성하는 최소 단위의 점이며, RGB 강도를 조절하여 색상 표현

RGB: Red, Green, Blue

컬러 스페이스(color space, 색 공간): 색을 표현하는 방식. 채널로 구성되어 있다.


래스터(raster), 비트맵(bitmap): 각 점의 색상 값을 저장하는 방식.
각 색상별 8비트를 사용하여 0~255 값으로 색의 감도 표시

벡터(vector): 점과 선의 위치를 방적식으로 기록 → 확대, 축소에 따라 각 화소에 어떻게 표현될 지 재계산 → 깨지지 않음

YUV 방식: 흑백 채널에 1/4의 해상도를 가진 두 색상 채널을 덧붙임

HSV(Hue 색상, Saturation 채도, Value 명도)

CMYK(Cyan, Magenta, Yellow, Black): 각 색을 조합하여 검은색을 표현하는 것이 낭비가 심하다. 그럴 때 RGB 대신 사용하면 좋다.



JPEG: 근처 화소들끼리 묶어 이미지 압축 → 색상 정보 손실 → 재압축이 일어나면 디지털 풍화 발생

PNG: 색상 손실 없이 이미지 압축 (사용된 색상을 정의해두었다가 추후에 참조) → 사용 색상에 따라 용량 결정

GIF: 이미지 내 여러 프레임을 둔다 → 손실 X, 하지만 256개의 색상만 기억






2. Pillow


Numpy와 결합하여 간편하게 이미지 작업을 할 수 있다.

PIL: Python Image Library

  • 이미지배열형태 데이터.
    • 데이터 타입: uint8
    • 8비트 정수
    • 0~255 사이 값



# numpy, pillow import
import numpy as np
from PIL import Image

# 32x32 검은 이미지
data = np.zeros([32, 32, 3], dtype=np.uint8)
image = Image.fromarray(data, 'RGB')

# 빨간 이미지 
data[:, :] = [255, 0, 0]
image = Image.fromarray(data, 'RGB')

PIL.Image.fromarray(): 이미지로 변환
np.zeros() : 배열 초기화 (배열을 0으로 채움)



width & height

from PIL import Image
import os

# 연습용 파일 경로
image_path = os.getenv('HOME')+'파일경로'

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

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

# JPG 파일 형식으로 저장해보기
new_image_path = os.getenv('HOME')+'파일 경로
img = img.convert('RGB')
img.save(new_image_path)



resize

# 이미지 크기 변경하기
resized_image = img.resize((100,200))

# 저장하기
resized_image_path = os.getenv('HOME')+'이미지 파일 경로
resized_image.save(resized_image_path)



crop

# 이미지의 부분만 크롭하기
# 크롭할 부분의 좌표
box = (300, 100, 600, 400)
region = img.crop(box)






3. OpenCV


오픈소스로 제공되는 컴퓨터 비전용 라이브러리.
영상 처리에 대한 다양한 기능 구현

  • OpenCV에서는 RGB가 아닌 BGR 순서 사용

  • imread: 파일로부터 이미지를 읽어와 반환해 주는 함수

  • cvtColor: 컬러 스페이스 변환(convert) 함수

  • cv.inRange(): img 를 변환한 hsv에다가 이 기준들를 적용하여, 해당하는 픽셀들에는 1, 그렇지 않은 픽셀들에는 0을 찍어놓은 배열을 반환






4. 비슷한 이미지 찾아내기


히스토그램: 이미지에서 픽셀 별 색상 값의 분포

# opencv python, matplotlib 설치
$ pip install opencv-python matplotlib






설계

  • 코드 구체화에 대해 생각해본다.
  • 어떤 기술을 사용해서 구현할 것인가 고민해보기
  • 어떤 데이터를 활용할 것인지 생각
  • 코드 구조는 큰 흐름을 잡고 살을 붙이는 과정을 반복한다.
  • 작동 순서 생각해보기



아이디어 구체화



핵심 알고리즘 - 유사도 계산 방법

  • 유사도를 기준으로 순서를 정하려면 유사도 계산이 필요하다.
  • OpenCVcompareHist() 함수를 사용하여 입력 이미지와 검색 대상 이미지의 히스토그램 간 유사도를 계산



기능의 모듈화

  • 유관한 단계들을 묶어 함수들로 만들기



최종적인 설계 과정

  • 프로그램 실행

  • build_histogram_db()

    • CIFAR-100 이미지 불러오기
    • CIFAR-100 이미지들을 히스토그램으로 만듦
    • 이미지 이름 = 키, 히스토그램 = 값으로 하는 딕셔너리 histogram_db 반환
  • 입력된 이미지 이름에 해당하는 히스토그램을 입력 이미지로 선택하여 target_histogram로 변수명 지정

  • search()

    • target_histogramhistogram_db를 입력으로 받기
    • OpenCVcompareHist() 함수를 사용하여 입력 이미지와 검색 대상 이미지의 히스토그램 간 유사도를 계산
    • 결과는 result 딕셔너리로, 키는 이미지 이름, 값은 유사도로 함
    • 계산된 유사도를 기준으로 정렬하여 순서 매기기
    • 유사도 순서상으로 상위 5개 이미지만 골라서 result에 남긴다.
  • 고른 이미지 표시

  • 프로그램 종료



코드 구현






추가 학습 자료


CIFAR-100
OpenCV

imread

bitwise_and()

OpenCV: Histograms - 1 : Find, Plot, Analyze !!!

0개의 댓글