AI 머신러닝 딥러닝/Open CV 프로그래밍 공부일지

Open CV 기초 공부 일지 1. Open CV 설치 및 영상의 종류와 표현방법 (1)

Tomitom 2023. 1. 11. 17:48
반응형

이미지 표현

영상의 종류와 표현 방법

영상은 크게 정지영상(image)과 동영상(movie)로 구분할 수 있습니다.

 

정지영상에는 문자 또는 도형 등을 표현한 2진 영상, 흑백 사진에 해당하는 회색조(grayscale) 영상, 자연색을 표현한 컬러 영상(RGB 색상 코드 등), 멀티스팩트럼 영상 등이 있습니다.

 

동영상에는 흑백 동영상과 컬러 동영상이 있습니다.

 

  • 2진 영상 : 검은색과 흰색으로만 표현된 영상
  • 회색조 영상 : 검은색과 흰색 그리고 검은색과 흰색 사이의 단계를 둔 회색으로 표현된 영상 (모토크롬. 검은색과 흰색 사이를 수치로 표현하는 것)
  • 멀티 스팩트럼 영상 : 다중분광영상. 가시광선 외 자외선과 같은 영역의 스팩트럼 정보를 포함한 영상 (ex. X-ray, 열화상, 적외선 카메라 등)
  •  

디지털 이미지와 좌표 표현 방법

컴퓨터에 저장된 디지털 이미지는 2차원(x, y) 배열 구조 입니다.

 

파이썬 openCV는 넘파이numpy 배열ndarray을 기본으로 사용합니다. 디지털 이미지에서 기준점은 영상의 가장 왼쪽 위 지점이며, 이곳의 좌표는 (0,0)에 해당합니다. 오른쪽으로 이동할수록 x좌표가 커지고, 아래쪽으로 이동할수록 y좌표가 커집니다.

 

이미지는 화소(pixel)들로 구성되어 있습니다. 화소 하나는 영상에서 점 (point)하나에 해당합니다.

표본화와 양자화

  • 표본화 : 공간적으로 연속되는 화상을 이산적인 화소의 집합으로 나누는 것. (이미지의 부분을 추출하여 2행 3열로 쪼개는 것처럼 부분을 나누는 것)
  • 양자화 : 이미지의 농담을 이산적인 정수값으로 변환, 조작하는 것 (흑백을 반전하거나 등)

OPENCV 와 이미지 읽기

Open CV 란?

OpenCV(Open Source Computer Vision) 은 오픈소스 컴퓨터 비전 및 기계 학습 소프트 웨어 라이브러리 입니다.

 

OpenCV 는 컴퓨터 비전 응용 프로그램을 위한 공통 인터페이스를 제공하고 상용 제품에서 기계 인식의 사용을 쉽고 빠르게 처리하기 위해서 구축되었습니다. OpenCV 는 BSD 라이센스 제품이므로 누구든지 무료로 사용할 수 있습니다. (BSD 라이센스로 상업적인 프로그램을 개발하면 라이센스를 밝혀야합니다.)

 

OpenCV 는 C++, JAVA, Pthon 및 MATLAB 인터페이스가 지원되며 대부분의 주요 운영체제(Window, Linux, OS X, Android 등에서 사용 가능합니다.(호환성이 좋습니다.) 다만 일부 리눅스 배포판에서는 호환되지 않는 경우도 있으니 주의가 필요합니다.

 

실시간 이미지 프로세싱에 중점을 둔 라이브러리 입니다. 자율주행, 딥러닝에도 많이 사용되며, 주로 컴퓨터의 눈을 담당하는 기술입니다.

 

Open CV 설치 

1. OpenCV 는 아나콘다의 주피터 환경에서 사용하겠습니다. 

https://blue-dot.tistory.com/32

 

 

AI 인공지능 수학 공부일지 1. 파이썬 개발 환경 아나콘다Anaconda 설치하기, 주피터 Jupyter 실행하기

오늘부터 인공지능 수학을 공부합니다. 인공지능용 수학은 필요한 분야의 수학이 정해져 있습니다. 벡터, 행렬, 텐서 등을 다루는 선형대수, 상미분, 편미분, 연쇄법칙 등을 다루는 미분, 표준편

blue-dot.tistory.com

 

 

conda 프롬프트에 pip install opencv-contrib-python youtube_dl pygame 설치

 

youtube_dl 은 유튜브에서 정보를 수집하기 위한 패키지이며 pygame 은 창을 띄워서 ㅂ디오를 추출한 내용을 출력할 때 쓰는 패키지입니다. 

 

 

 

설치 후에는 import cv2 로 버전을 확인합니다. 

cv2.__version__

 

 

cv.imread() 로 이미지 불러오기

cv2.imread() 는 이미지 파일을 불러와 넘파이 배열로 변환합니다. (넘파이 배열이 어떻게 변환되는지 플래그에 따라 달라집니다.) 인수로 전달되는 값은 파일 이름과 플래그 입니다.

 

여기에서 사용할 예제는 레나lena.jpg 이미지입니다.
주피터 하위 경로에 data 폴더를 만든 뒤 lena.jpg 이미지를 저장해주세요.

(

 

 

cv2.imread(fileName, flags) -> img

  • fileName : 이미지 파일의 경로를 지정합니다.
  • flags : 이미지 파일을 읽어 들일 때의 옵션 사항을 추가 입력합니다.
  1. cv2.IMREAD_COLOR : 이미지 파일을 컬러로 읽습니다. 투명한 부분은 무시되며, 기본값 입니다. 숫자 1을 사용할 수 있습니다.
  2. cv2.IMREAD_GRAYSCALE : 이미지를 회색조로 읽습니다. 숫자 0 을 사용할 수 있습니다.
  3. cv2.IMREAD_UNCHANGED : 이미지를 불투명도(알파) 까지 포함하여 읽습니다. 숫자 -1을 사용할 수 있습니다. 주로 png에 해당합니다.

 

cv2.imshow() 로 이미지 출력하기

파일에서 읽은 이미지를 화면에 출력하기 위해 cv2.imshow() 함수를 사용합니다. 이미지가 새 윈도우 창에서 출력됩니다.

cv2.imshow(title, image)

  • title : 문자열 타입이며 윈도우 창의 제목을 지정합니다.
  • image : 화면에 표시할 이미지 객체입니다. 타입은 numpy의 ndarray 입니다.

cv2.imshow()와 같이 쓰는 함수들

일반적으로 imshow() 는 다음 함수들과 함께 사용됩니다.

  • cv2.waitkey() : 키보드 입력을 대기하는 함수입니다. 인수가 0 이면 키 입력까지 무한대기이며, 특정 시간 동안 대기하려면 밀리초 값을 인자로 전달합니다.
  • cv2.destroyAllWindows() : 화면에 나타난 모든 윈도우를 종료합니다.

(창을 키보드 입력으로 종료하고 싶을 때-> 키를 누를 때까지 무한대기 키를 설정하고, 모든 윈도우를 종료하도록 설정)

 

 

# 영상 파일 읽기 및 화면 표시 

import cv2
import numpy as np 

imageFile = './data/lena.jpg'

img = cv2.imread(imageFile)   #기본값은 color 그대로 읽는다. 
img2 = cv2.imread(imageFile, 0)   # 0 값을 주는 것은 회색조.

cv2.imshow('Lena Color', img)
cv2.imshow('Lena Gray', img2)

cv2.waitKey()  # 키 입력을 기다린다. 키를 입력하는 순간 반응을 할 수 있도록 정해주어야 한다. 
cv2.destroyAllWindows()  # 창이 닫힌다.

 

cv2.imwrite() 로 이미지 저장하기

cv2.imwrite() 함수를 이용하면 배열을 이미지 파일에 저장할 수 있습니다. 파일의 형식은 파일명의 확장자를 통해 지정됩니다.

 

cv2. imwrite(fileName, image) -> retval

  • fileName : 문자열 타입이며 저장될 파일명을 지정합니다.
  • image : 저장할 이미지 객체입니다. 타입은 numpy 의 ndarray 입니다.
# 영상 파일 저장

imageFile = './data/lena.jpg'
img = cv2.imread(imageFile)

cv2.imwrite('./data/Lena.bmp', img)
cv2.imwrite('./data/Lena.png', img)
cv2.imwrite('./data/Lena2.png', img,
           [cv2.IMWRITE_PNG_COMPRESSION,9])  
# img 의 압축률 9 의 PNG 영상으로 저장. 압축률이 높을수록 시간이 오래 걸리며 디폴트 값은 3이다. 

cv2.imwrite('./data/Lena2.jpg', img,
           [cv2.IMWRITE_JPEG_QUALITY,90])  
# img 의 품질을 90의 JPEG로 저장. 품쥘의 범위는 [0,100]이며 높을수록 영상 품질이 좋다. 디폴트 95이다.

 

 

레나 이미지가 지정한 이미지 형식대로 저장된 것을 확인할 수 있습니다. 

 

# [dir(cv2)]  cv2 안에 들어있는 세부 항목들을 볼 수 있습니다. 리스트 내포를 할 수 있어요. 

flags =  [flag for flag in dir(cv2) if flag.startswith("IMWRITE_")] 
#IMWRITE로 시작하는 항목들의 리스트를 볼 수 있다. 
#startswith (~으로 시작하는 것 )

print(flags)

 

리스트 내포를 이용하면 cv2 안에 들어있는 세부 설정들을 확인할 수 있습니다. 

 

 

가령 IMWRITE 로 시작하는 항목의 리스트를 확인하여 어떤 기능들이 있는지 볼 수 있어요.

하지만 기능이 너무 많으니 정말 필요한 기능들만 취사선택해야 할 것 같습니다. 

 

Color 이미지로 출력

Open CV 는 컬러 영상을 BGR 순서로 처리하고, Matplotlib 는 RGB 채널 순서로 처리합니다. 

즉 Open CV는 색상의 순서가 RGB가 아닌 BGR로 되어 있다는 것을 유념해야합니다! 

Open CV로 읽은 컬러 영상 imgBGR의 채널 순서 BGR을 cvtColor() 로 RGB 채널 순서로 변경해줍니다. 

 

 

import cv2
from matplotlib import pyplot as plt

imageFile = './data/lena.jpg'
imgBGR = cv2.imread(imageFile)   # 색상의 순서가 RGB가 아니라 BGR로 들어온다. 주의!
plt.axis('off') # x와 y축을 표시하지 않는다. 

imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()

 

 

 

 

이 다음에는 회색으로 출력하는 것부터 응용을 한 기능들을 확인하겠습니다! 

반응형