본문 바로가기
Study/Python

[Python] OpenCV - 1 이미지 로드 및 저장

by YoungD 2023. 10. 19.
 
 

OpenCV 개요 및 환경설정

필요 선수학습

  • 파이썬
  • 파이썬 라이브러리 (Numpy, Pandas, Matplotlib 등)

개요

  • OpenCV
    • Gray Bradsky에 의해 1996년 인텔에서 시작된 프로젝트
    • 컴퓨터 비전, 머신러닝과 관련된 다양한 알고리즘을 지원
    • C++, Python, Java 등의 언어를 지원
    • CUDA(Compute Unified Device Architecture), OpenCL (Open Computing Language)에 기반한 인터페이스를 지원

  • OpenCV + Python
    • OpenCV의 파이썬 API로 C/C++로 된 OpenCV 라이브러리들을 파이썬 래퍼로 감싼 후에 파이썬 모듈을 추가시킨 것
    • 속도문제를 해결하기 위해 속도가 문제되는 코드는 C/C++로 코딩하고 파이썬에서 불러 사용할 수 있는 파이썬 래퍼를 제공
    • OpenCV 배열은 Numpy 배열로 변환되어 내부 처리를 수행 (Numpy의 모든 연산 가능)
    • Numpy, SciPy, Matplotlib 라이브러리와도 호환

추천 사이트

OpenCV 환경 설정

아나콘다 네비게이터에서 설치하는 방법

  • 아나콘다 네비게이터 실행
  • Python 3.7 사용
  • Environments 메뉴를 선택하고 Create 버튼을 클릭
  • Name에 OpenCV를 입력하고 Python 버전은 3.7을 선택
    • 3.7이 나오지 않는다면 update index 버튼을 클릭하여 업데이터 진행
  • Create 버튼을 클릭하여 새로운 환경 생성
  • 생성된 환경을 선택하고 리스트에서 Not installed 항목을 선택
  • 입력창에 opencv를 입력하여 libopencv, opencv, py-opencv를 선택
  • 같은 방법으로 Jupyther, numpy(자동설치확인), pandas, matplotlib, searborn, scikit-learn, tensorflow-gpu, cudnn, codatookit을 선택
  • Apply 버튼을 클릭하여 설치 준비
  • 새창이 뜨면 선택한 목록을 확인하고 Apply 버튼을 클릭하여 설치 시작
  • 생성한 환경으로 주피터 노트북 실행

프롬프트 창에서 설치하는 방법

In [1]:
#!pip uninstall opencv-python
#!pip uninstall opencv-contrib-python
In [2]:
# opencv-python : 주요 모듈이 포함된 라이브러리
# opencv-contrib-python : 추가 모듈이 포함된 라이브러리

#!pip install opencv-python==3.4.11.45
#!pip install opencv-contrib-python==3.4.11.45
!pip install opencv-python opencv-contrib-python
Requirement already satisfied: opencv-python in c:\users\gjaischool\anaconda3\lib\site-packages (4.8.1.78)
Requirement already satisfied: opencv-contrib-python in c:\users\gjaischool\anaconda3\lib\site-packages (4.8.1.78)
Requirement already satisfied: numpy>=1.19.3 in c:\users\gjaischool\anaconda3\lib\site-packages (from opencv-python) (1.23.5)
In [3]:
# opencv 설치 확인
import cv2

# 버전 확인
print(cv2.__version__)
4.8.1
In [4]:
#from google.colab import drive
#drive.mount('/content/drive')
In [5]:
#%cd /content/drive/MyDrive/Colab Notebooks/인공지능강의/opencv

이미지를 읽고 출력하기

이미지를 읽고 새창에 출력하기

  • cv2.imread(파일명, 이미지 형식) : 이미지 파일을 읽기 위한 객체를 리턴
    • 이미지형식 : 칼라 (cv2.IMREAD_COLOR), 흑백(cv2.IMREAD_GRAYSCALE) 등
  • cv2.imshow(제목, 이미지 객체) : 이미지 출력
  • cv2.waitKey(0) : 키보드 입력을 기다리는 시간 설정 (0 : 계속 기다림)
    • 1/1000초 단위
  • cv2.destroyAllWindows() : 생성한 윈도우를 모두 닫는다
In [6]:
import cv2

# 이미지 읽기
img = cv2.imread("./images/image.jpg")

# 새창에 이미지 출력
cv2.imshow("test", img)

# 사용자가 아무키나 누를때까지 대기
cv2.waitKey(0)

# 연 창을 닫아준다
cv2.destroyAllWindows()
실습문제

○ 학습한 OpenCV 함수를 이용해서 다른 이미지를 출력해보자.
 

matplotlib를 이용하여 이미지 출력하기

In [7]:
import matplotlib.pyplot as plt

plt.imshow(img)
plt.show
  • OpenCV는 색상공간을 BGR(Blue Green Red)을 사용
  • Python 이미지들은 RGB(Red Green Blue)을 사용하므로 변환 필요
  • 따라서, OpenCV로 읽은 이미지를 Matplotlib으로 출력하려면 색상공간을 변환해야 함
  • cv2. cvtColor(img, 색상변환옵션)
    • 색상변환옵션 : cv2.COLOR_BGR2RGB, cv2.COLOR_RGB2GRAY, cv2.COLOR_RGB2HSV 등
In [8]:
# R<-> 변경
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(img2)
# 눈금 삭제
plt.xticks([])
plt.yticks([])
plt.show()

직접 Red 채널과 Blue 채널을 바꾸기

  • b, g, r = cv2.split(img) : img파일을 b,g,r로 분리
  • cv2.merge([r,g,b]) : b, r을 바꿔서 Merge
In [9]:
# 실습
실습문제

○ 다른 이미지를 이용해서 Red 채널과 Blue 채널의 색상을 바꿔보자.

Widget를 이용해서 이미지 출력하기

In [10]:
!pip install ipywidgets
In [11]:
import ipywidgets as wid
from IPython.display import display
import cv2

img = cv2.imread("./images/image.jpg")

# 이미지를 출력할 위젯 생성
h, w, c = img.shape

# Image 위젯 설정 (이미지 타입, 크기)
img_wid = wid.Image(format="jpeg", width=w, height=h)

# 위젯 출력
display(img_wid)

# 위젯에 읽은 이미지를 출력
# 배열로 된 이미지를 JPG 타입으로 변환
_, en_img = cv2.imencode(".jpeg", img)

# 위젯에 변환된 이미지 전송 - byte 단위로 전송
img_wid.value = en_img.tobytes()
요약
 cv2.imread() : 이미지를 읽음
 cv2.imshow() : 새창에 이미지 출력
 cv2.cvtColor() : 이미지의 색상공간을 변환
 cv2.waitKey() : 키 입력 대기 (1/000초 단위)
 cv2.destroyAllWindows() : 생성한 윈도우를 모두 닫음
○ OpenCV 색상공간과 Python의 색상공간이 다르므로 변환이 필요 (BGR → RGB)

'Study > Python' 카테고리의 다른 글

[OpenCV] - 3 동영상 로드 및 저장  (1) 2023.10.23
[Python]OpenCV - 2 이진화  (1) 2023.10.20
[Python] Train Data 실습  (0) 2023.10.18
[Python] Numpy 배열  (1) 2023.10.17
[Python] Matplotlib  (0) 2023.10.16