OpenCV - 환경설정 및 이미지 출력해보기

songmin jeon·2024년 1월 4일
0

선행작업! 작업 쥬피터 다운로드 필수


0. 환경설정해보기

0.1. 쥬피터 경로 접속하여 폴더 생성


0.2. 제공한 파일 다운로드 및 압축풀기!

1. 4개 전부 있어야함!

2. 반디집으로 4개 한번에 압축 풀어야함!

3. 완료 후 images 폴더 생성된걸 확인가능


1. openCV

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

1.1. OpenCV + Python

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

2. opencv 설치

다음과 같이 나오면 설치완료

# 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

# opencv 설치 확인
import cv2

# 버전 확인
print(cv2.__version__)

4.9.0


3. 이미지를 읽고 출력하기

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

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

3.2. 실습해보기

# cv2 기능불러오기
import cv2
# img변수에 경로에 있는 이미지, 이미지 타입
img = cv2.imread("images/hanam.jpg", cv2.IMREAD_COLOR)
# 이미지 보여주기 모델에 변수 불러오기
cv2.imshow("model", img)

# 키 대기
cv2.waitKey(0)
# 이미지 종료
cv2.destroyAllWindowd()


3.3. 색상문제

  • OpenCV는 색상공간을 BGR(Blue Green Red)을 사용
  • Python 이미지들은 RGB(Red Green Blue)을 사용하므로 변환 필요
  • 따라서, OpenCV로 읽은 이미지를 Matplotlib으로 출력하려면 색상공간을 변환해야 함

  • cv2. cvtColor(img, 색상변환옵션)
    • 색상변환옵션 : cv2.COLOR_BGR2RGB, cv2.COLOR_RGB2GRAY, cv2.COLOR_RGB2HSV 등



3.3.1. 이를 해결하기 위한 2가지 방법.

  • 색변경 (1) - 색상공간을 변환(BGR -> RGB)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • 색변경 (2) - 색상코드를 직접 바꿔보기
    b,g,r = cv2.split(img)
    img2 = cv2.merge([r,g,b])
# 실습
import cv2 # openCV
from matplotlib import pyplot as plt

# 이미지 불러오기
img = cv2.imread('images/lenna.png', cv2.IMREAD_COLOR)

# # 색변경 (1) - 색상공간을 변환(BGR -> RGB)
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 색변경 (2) - 색상코드를 직접 바꿔보기
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])

plt.xticks([])
plt.yticks([])

plt.imshow(img2)

4. 라이브러리 호출

# 실습
# 라이브러리 호출
import ipywidgets as widgets
from IPython.display import display
import cv2

# 이미지가져오기
img = cv2.imread('images/lenna.png', cv2.IMREAD_COLOR)

# 원본 이미지의 크기
# 행, 열, 색상채널
h, w, c = img.shape

# 이미지 위젯 설정(이미지의 형식, 크기)
image_widget = widgets.Image(format='jpeg', width=w, height=h)

# 위젯 출력
display(image_widget)

# 위젯에 이미지 출력
# 현재 읽어들인 이미지는 Numpy 배열 타입으로 바뀜 -> jPEG 타입으로 변환
# _ 변수는 값만 담아주고 안쓰는 변수를 할때, _(언더바) 변수를 사용함..
_, en_image = cv2.imencode(".jpeg", img)

# 변환된 이미지를 바이트 단위로 위젯에 전송
image_widget.value = en_image.tobytes()

5. 학습요약


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

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

○ OpenCV 색상공간과 Python의 색상공간이 다르므로 변환이 필요 (BGR → RGB).

  • cv2. cvtColor(img, 색상변환옵션)
  • 색상변환옵션 : cv2.COLOR_BGR2RGB, cv2.COLOR_RGB2GRAY, cv2.COLOR_RGB2HSV 등

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

  • b, g, r = cv2.split(img) : img파일을 b,g,r로 분리
  • cv2.merge([r,g,b]) : b, r을 바꿔서 Merge

5.1. 정리내용...

cv2.imread('경로/파일명', cv2.이미지 형식(컬러와 흑백 구분))
컬러 : cv2.IMREAD_COLOR
흑백 : cv2.IMREAD_GRAYSCALE

별도의 창을 출력한다.
cv2.imshow(별도창의 이름, 이미지 변수명)

별도의 창이 뜨면 버튼 클릭을 기다린다. (0은 무한)
cv2.waitKey(0)
위 버튼이 눌러지면 창이 종료됨.
cv2.destroyAllWindows()


matplotlib 이용하여 이미지 출력

plt.xticks([]) : x축의 표를 안나오게 해주는 기능
plt.yticks([]) : y축의 표를 안나오게 해주는 기능

plt.imshow(변수명) : cv2.imshow()와 다른 점은 창이름을 넣으면 에러발생!


opencv와 python의 컬러 매칭이 다름

1번째 방법 : cv2.cvtColor(변수명, 색상변환옵션)
색상변환옵션 : cv2.COLOR_BGR2RGB, cv2.COLOR_RGB2GRAY, cv2.COLOR_RGB2HSV 등

2번째 방법 : b, g, r = cv2.split(변수명) : 변수파일을 b, g, r로 분리
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])

원본 이미지 크기 (,, 색상)
h, w, c = img.shape

이미지 위젯설정(이미지 형식, 크기)
image_widget = widets.Image(format='jpeg', width=w, height=h)

위젯 출력 
display(imge_widget)

위젯에 이미지 출력
현재 읽어들인 이미지는 Numpy 배열 타입으로 바뀜 -> JPEG 타입으로 변환
_(언더바) 변수는 값만 담아주고 안쓰는 변수를 사용할때 쓰임.
_, en_image = cv2.imencode(".jpeg", img)

변환된 이미지를 바이트 단위로 위젯에 전송
image_widet.value = en_image.tobytes()





profile
제가 한 번 해보겠습니다.

0개의 댓글