🚀 OpenCV의 개요
Python 기반 주요 이미지 라이브러리
- PIL(Python Image Library)
- 주로 이미지 처리만을 위해 사용
- 처리 성능이 상대적으로 느림
- Scikit Image
- Python 기반의 전반적인 컴퓨터 비전 기능 제공
- 사이파이(Scipy) 기반
- OpenCV
- 오픈소스 기반의 최고 인기 컴퓨터 비전 라이브러리
- 컴퓨터 비전 기능 일반화에 크게 기여
- C++ 기반이나 Python도 지원
OpenCV 특징
- 인텔이 초기 개발 주도
- 다양한 플랫폼에서 사용 가능
- Windows, 리눅스, Mac OS X, 안드로이드, iOS 등
- 방대한 컴퓨터 비전 관련 라이브러리와 손쉬운 인터페이스 제공
OpenCV 이미지 로딩
imread('파일명')
를 이용한 이미지 로딩
- 주의해야할 점
- 색감이 원본 이미지와 다르게 나타남
- 이미지를 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()
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)
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]
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()
* 출처: 인프런 '딥러닝 컴퓨터 비전 완벽 가이드'