OpenCV의 이해 및 실습

타키탸키·2021년 8월 18일
0

Vision

목록 보기
7/11

🚀 OpenCV의 개요

Python 기반 주요 이미지 라이브러리

  • PIL(Python Image Library)
    • 주로 이미지 처리만을 위해 사용
    • 처리 성능이 상대적으로 느림
  • Scikit Image
    • Python 기반의 전반적인 컴퓨터 비전 기능 제공
    • 사이파이(Scipy) 기반
      • Numpy 기반
  • OpenCV
    • 오픈소스 기반의 최고 인기 컴퓨터 비전 라이브러리
    • 컴퓨터 비전 기능 일반화에 크게 기여
      • 어려운 기능도 API 몇 줄로 간단하게 구현
    • C++ 기반이나 Python도 지원
      • JAVA, C# 등 다양한 언어 지원

OpenCV 특징

  • 인텔이 초기 개발 주도
  • 다양한 플랫폼에서 사용 가능
    • Windows, 리눅스, Mac OS X, 안드로이드, iOS 등
  • 방대한 컴퓨터 비전 관련 라이브러리와 손쉬운 인터페이스 제공

OpenCV 이미지 로딩

  • imread('파일명')를 이용한 이미지 로딩
    • 파일을 읽어 Numpy array로 변환
  • 주의해야할 점
    • 색감이 원본 이미지와 다르게 나타남
      • 이미지를 RGB 형태가 아닌 BGR 형태로 로딩
      • RGB: RED 계열
      • BGR: BLUE 계열
import cv2
import matplotlib.pyplot as plt

img_array=cv2.imread('파일명')
plt.imshow(img_array)

BGR을 RGB로 변환하기

  • cvtColor()를 이용하여 BGR을 RGB로 변환
    • cvtColor(이미지 배열, cv2.COLOR_BGR2RGB)
import cv2
import matplotlib.pyplot as plt

bgr_img_array=cv2.imread('파일명')
rgb_img_array=cv2.cvtColor(bgr_img_array, cv2.COLOR_BGR2RGB)
plt.imshow(rgb_img_array)

OpenCV 이미지 배열을 파일에 쓰기

  • imwrite()를 이용하여 파일에 쓰기
    • imwrite('출력파일명', 이미지 배열)
      • 메모리에 있는 이미지 배열을 다시 파일에 저장
  • imread()로 읽고 imwrite()로 출력한 이미지 파일은 다시 RGB 형태가 됨
    • imread()로 인해 BGR 형태로 되어 있는 이미지 배열을 다시 RGB 형태로 변환하여 저장
import cv2
import matplotlib.pyplot as plt

img_array=cv2.imread('파일명')
cv2.imwrite('출력파일명', img_array)

OpenCV Windows Frame 인터페이스

  • OpenCV Windows Frame 인터페이스
    • Windows Frame과 바로 인터페이스하여 사용할 수 있는 여러 기능 제공
    • Window Frame 생성이 가능한 GUI 개발 환경에서만 사용 가능
      • Windows GUI, Linux X-windows 등
    • Jupyter Notebook 기반에서는 오류 발생
      • 이미지 배열의 시각화에 matplotlib 사용
  • 관련 함수
    • cv2.imshow(이미지 array)
      • 이미지 배열을 window frame에 보여줌
    • cv2.waitKey()
      • 키보드 입력이 있을 때까지 무한 대기
    • cv2.destroyAllWindows()
      • 화면의 윈도우 프레임 모두 종료

🚀 OpenCV를 활용한 이미지 처리 실습

OpenCV의 이미지와 영상 처리

  • Python에서 사용되는 여러 image 라이브러리를 간단히 살펴보고 OpenCV와의 차이 이해
  • OpenCV의 단일 이미지 처리 방식 이해
  • OpenCV의 비디오 영상 처리 방식 이해

OpenCV 이미지 처리 이해 및 타 패키지 비교

  • PIL 패키지를 이용하여 이미지 로드하기
    • open()으로 image file 읽어서 ImageFile 객체로 생성
    • 자료형: JpegImageFile
# 다운로드
!mkdir ./data
!wget -O /content/data/beatles01.jpg https://raw.githubusercontent.com/chulminkw/DLCV/master/data/image/beatles01.jpg

import matplotlib.pyplot as plt
import os
%matplotlib inline
from PIL import Image

pil_image = Image.open('/content/data/beatles01.jpg')
print('image type:', type(pil_image))

plt.figure(figsize=(10, 10))
plt.imshow(pil_image)
#plt.show()
image type: <class 'PIL.JpegImagePlugin.JpegImageFile'>
<matplotlib.image.AxesImage at 0x7fe84f217890>

  • skimage(사이킷이미지)로 이미지 로드하기
    • skimage는 imread()를 이용하여 RGB 원본 이미지를 RGB 형태의 Numpy 배열로 반환
from skimage import io

sk_image = io.imread('/content/data/beatles01.jpg')
print('sk_image type:', type(sk_image), ' sk_image shape:', sk_image.shape)

plt.figure(figsize=(10, 10))
plt.imshow(sk_image)
#plt.show()
sk_image type: <class 'numpy.ndarray'>  sk_image shape: (633, 806, 3) # 세로, 가로
<matplotlib.image.AxesImage at 0x7fe84f1d4e50>
  • OpenCV로 이미지 로드하기
    • imread()
      • 원본 RGB 이미지를 BGR 형태의 Numpy 배열로 반환
    • imwrite()
      • BGR 형태의 이미지 배열을 파일에 기록할 때 다시 RGB형태로 변환
      • RGB->BGR->RGB 변환에 신경쓰지 않아도 됨
import cv2

cv2_image = cv2.imread('/content/data/beatles01.jpg')
cv2.imwrite('/content/data/beatles02_cv.jpg', cv2_image)
print('cv_image type:', type(cv2_image), ' cv_image shape:', cv2_image.shape)

plt.figure(figsize=(10, 10))
img = plt.imread('/content/data/beatles02_cv.jpg')
plt.imshow(img)
#plt.show()

OpenCV - 반환된 BGR image Numpy array 시각화 하기

cv2_image = cv2.imread('/content/data/beatles01.jpg')

plt.figure(figsize=(10, 10))
plt.imshow(cv2_image)
plt.show()

  • skimage(사이킷이미지)의 0번 인덱스
    • RED
sk_image = io.imread('/content/data/beatles01.jpg')
print(sk_image.shape)
sk_image[:, :, 0] # RED의 값
(633, 806, 3)
array([[ 18,  17,  18, ...,  46,  38,  63],
       [ 18,  18,  18, ...,  72,  41,  37],
       [ 18,  18,  18, ...,  84,  56,  42],
       ...,
       [225, 226, 228, ..., 231, 228, 229],
       [225, 225, 226, ..., 229, 229, 227],
       [225, 225, 224, ..., 227, 227, 227]], dtype=uint8)
  • OpenCV의 0번 인덱스
    • BLUE
cv2_image = cv2.imread('/content/data/beatles01.jpg')
print(type(cv2_image))
print(cv2_image.shape)
cv2_image[:, :, 0] # BLUE의 값
<class 'numpy.ndarray'>
(633, 806, 3)
array([[ 19,  19,  20, ...,  47,  39,  64],
       [ 20,  20,  20, ...,  71,  40,  36],
       [ 20,  20,  20, ...,  82,  54,  40],
       ...,
       [198, 199, 201, ..., 190, 189, 188],
       [198, 198, 199, ..., 188, 188, 186],
       [199, 199, 198, ..., 186, 186, 186]], dtype=uint8)
  • OpenCV의 2번 인덱스
    • RED
    • skimage(사이킷이미지)의 0번 인덱스와 동일한 결과
cv2_image[:, :, 2]
  • BGR에서 RGB로 변환하기
cv2_image = cv2.imread('/content/data/beatles01.jpg')
draw_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(10, 10))
plt.imshow(draw_image)
plt.show()

* 출처: 인프런 '딥러닝 컴퓨터 비전 완벽 가이드'
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글