본문 바로가기

Python

PIL과 OpenCV를 활용한 간단한 이미지 데이터 처리방법

 

이미지 처리 (Image Treatment)

 

이미지를 다루기 위해서는 이미지의 저장방식에 대해서 알아야 한다. 이미지는 다음과 같이 크게 2~3가지로 나뉘는데 우리가 다룰 컴퓨터 비전 이미지 데이터는 비트맵

 

[이미지 다루기]

비트맵 방식 : 이미지를 점으로 표현 (이미지를 확대하면 이미지가 모자이크같이 깨짐)

벡터 방식 : 이미지를 선으로 표현 (확대해도 깨지지 않음), 3D 디자인에서 많이 사용

컴퓨터 비전에서는 비트맵 방식을 사용함

라이다 경우는 Point Cloud 방식

컬러 이미지는 RGB 3가지 채널로 구성됨

색깔이 중요하지 않고 형체만 중요할 경우에는 흑백으로 변환하여 계산량을 절약함

 

비트맵 저장 방식

png (Portable Network Graphics) : 비손실 압축방식, 그래프 등에 적합

gif (Graphics Interchange Format) : png로 대체

jpeg (Joint Photographic Experts Group) : 손실압축방식, 사진 등에 적합, 편집/저장을 반복할 경우 화질이 열화됨

tiff (Tagged Image File Format) : 출력용

raw : 비압축 원본

 

벡터 저장 방식

pdf (Portable Document Format) : 문서용

eps (Encapsulated PostScript) : 문서용

svg (Scalable Vector Graphics) : 주로 웹사이트에서 사용

 

PIL


PIL (Python Imaging Library) 라이브러리
: 스웨덴 기업 Secret Lab AB가 1995년부터 개발하고 2011년에 중단되었고 Pillow라는 이름으로 포크되어 현재까지 지속 사용중에 있다. 이미지 파일열기, 닫기, 변환 등 기본적인 기능을 제공한다.


이미지 형식, 크기(가로픽셀 X 세로픽셀), 색상모드 보기


RGB 색상모드 : 빛의 삼원색을 기본으로 하는 색상모드
CMYK 색상모드 : 인쇄시 사용하는 포맷, 프린트 토너가 4가지 색깔로 구성, 프린트는 빛의 삼원색 개념으로 표현하기 어렵기 때문에 나온 색상모드

 

※ w // 2 는 w값을 2로 나눈 몫값을 말함

resize( ) : 크기변경, save( ) : 저장


변환

rotate( ) : 회전

  • 이미지 90도 회전시 사진이 짤린다.

 

  • expand를 사용하면 원래 이미지를 얻을 수 있다.


transpose( ) : 뒤집기


convert( ) : 흑백 모드로 변환


※ RGB를 흑백(Grayscale)으로 만드는 배합 여러가지 방법

https://en.wikipedia.org/wiki/Grayscale


filter( ) : 이미지 필터

BLUR : 이미지 흐리게 하기

  • 이미지에 노이즈가 심할 경우에 사용
  • 동일하고 비슷한 색깔끼리는 원색을 유지하고 색깔이 갑자기 변화하는 경계부는 주변 색깔을 가져와서 경계선 색깔을 뭉개버리는 원리로 처리


CONTOUR : 윤곽선 추출하기

  • 동일하고 비슷한 색깔은 밝게 하고 경계부는 색깔이 갑자기 변화하는 부위라서 그 본 색깔을 유지하게 하는 원리로 처리

 

 

OpenCV


PIL은 RGB로 이미지 데이터가 저장되는데, openCV는 BGR로 이미지 데이터가 저장된다.

이미지 파일 열기


이미지 구조 보기


이미지 보기

from PIL import Image
Image.fromarray(img)


BGR을 RGB로 변경

rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
Image.fromarray(rgb)



OpenCV Webcam Capture

import cv2
from PIL import Image

capture = cv2.VideoCapture(0)
ret, frame = capture.read()
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
Image.fromarray(rgb)



Edge Detection : 가장자리 검출

캐니함수사용
- 소벨과 라플라시안보다 성능이 좋음
- 노이즈에 민감하지 않음

canny(src, threshold1, threshold2)

  • threshold1 : 하위 임계값. 이보다 기울기가 낮은 가장자리는 무시
  • threshold2 : 상위 임계값. 이보다 기울기가 높은 가장자리는 추출
canny = cv2.Canny(gray, 30, 150)   
Image.fromarray(canny)


색반전

canny = cv2.Canny(gray, 30, 150)   
Image.fromarray(255 - canny)

 

 


[ PIL로 이미지를 불러와서 OpenCV로 흑백으로 만들고 윤곽선 필터링하기 ]

import numpy as np
from PIL import Image
import cv2

# PIL로 이미지 불러오기
img = Image.open('street.jpg')
img

 

# 불러온 이미지를 행렬 데이터로 변환하여 디스플레이
rgb = np.array(img)
Image.fromarray(rgb)


## RGB를 BGR로 변환하지 않고 흑백(Gray Scale)으로 그냥 변환

# 흑백으로 변환 : rgb 데이터는 이미지 행렬 데이터여야 함
gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)
Image.fromarray(gray)

 

# 캐니필터로 윤곽선 추출
canny = cv2.Canny(gray, 50, 255)
Image.fromarray(canny)

 

# 반전
Image.fromarray(255 - canny)



## OpenCV로 RGB를 BGR로 변환한 후, 흑백(Gray Scale) 변환한 경우,

# bgr롤 변환후 흑백으로 변환
bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
Image.fromarray(gray)

 

# 캐니필터로 윤곽선 추출
canny = cv2.Canny(gray, 50, 255)
Image.fromarray(255 - canny)