반응형

이미지 불러오기

import cv2

img = cv2.imread('canvas_1.jpg', cv2.IMREAD_COLOR)

Color 이미지는 Blue, Green, Read 순서의 3채널로 불러온다. 즉, 순서가 BGR이라는것을 명심해야한다. 우리가 보는 이미지는 RGB 순서로 이루어져 있기 때문에, 아래와 같이 채널의 순서를 교환해주어야 한다.

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

opencv는 이미지를 numpy로 표현하여 가져온다. 따라서 numpy에서 제공해주는 함수를 모두 사용할 수 있다. 몇가지 알아보자.

 

  • ndim: 이미지 차원의 수. color 이미지는 3, Gray 이미지는 2가 된다.
  • shape: 차원의 크기. color 이미지는 (Height, Width, 3), Gray 이미지는 (Height, Width)가 된다.
  • size: 전체 원소의 갯수
  • dtype: 원소의 데이터타입. uint8로 구성되어있다.
print(img.ndim) # 3
print(img.shape) # (600, 800, 3)
print(img.size) # 1440000
print(img.dtype) # uint8

이미지 데이터의 원소 자료형은 numpy로 표현할 수 있지만 OpenCV에서 제공하는 자료형이 따로 존재한다. 특정 함수에서는 OpenCV 자료형을 인자로 받는 경우가 있으니 알아두도록 한다.

 

이미지 데이터의 원소 자료형은 numpy로 표현할 수 있지만 OpenCV에서 제공하는 자료형이 따로 존재한다. 특정 함수에서는 OpenCV 자료형을 인자로 받는 경우가 있으니 알아두도록 한다. 각 숫자는 Bit를 의미하고, U는 Unsigned, S는 Signed, F는 Float을 나타낸다.

 

OpenCV 자료형 Numpy 자료형
cv2.CV_8U uint8
cv2.CV_8S int8
cv2.CV_16U uint16
cv2.CV_16S int16
cv2.CV_32S int32
cv2.CV_16F float16
cv2.CV_32F float32
cv2.CV_64F float64

 

이미지 보여주기

이미지를 보여주기 위해서는 캔버스를 만들고, 그 위에 이미지를 올려놓는 개념으로 생각하면 된다.

cv2.namedWindow('canvas', cv2.WINDOW_NORMAL)
cv2.imshow('canvas', img)
cv2.waitKey()
cv2.destroyAllWindows()

 

  • namedWindow: 캔버스를 만들어준다. 해당 Line을 생략할 경우, 이미지가 가지고 있는 가로, 세로 길이로 자동생성된다. WINDOW_NORMAL옵션을 함께 사용하면, 생성된 윈도우의 크기를 사용자가 조절할 수 있다.
  • imshow: 이미지를 보여주는 함수. 단독으로는 사용할 수 없으며 반드시 waitKey함수와 같이 사용해야한다.
  • waitKey: 키보드 입력을 기다리는 함수. 인자로 숫자를 넣어주면, 그만큼 시간(단위: ms)이 지난 후 종료된다. return값으로는 키보드 입력값의 ASCII코드를 반환한다. 아래와 같이 응용할 수 있다.
  • while True: cv2.imshow('canvas', img) if cv2.waitKey() == 27: # 27은 ESC의 ASCII코드 값. break cv2.destroyAllWindows()
  • destoryAllWindows: 생성되어있는 모든 윈도우를 제거한다.

 

cvtColor를 통해 BGR 이미지를 RGB로 바꾼 후, imshow를 하게되면 오히려 이미지가 이상하게 보이는 현상이 나타난다. 왜냐하면 imshow함수는 BGR 순서로 입력받기 때문이다. 이미지를 전처리한 후, 보여줄때의 채널 순서는 BGR 순서로 다시 바꿔야 한다는것을 명심하자.

img = cv2.imread('canvas_1.jpg', cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.namedWindow('canvas', cv2.WINDOW_NORMAL)
cv2.imshow('canvas', img) # img 채널순서는 RGB
cv2.waitKey()
cv2.destroyAllWindows()

RGB로 바꿨는데 이상하게 나온다.

img = cv2.imread('canvas_1.jpg', cv2.IMREAD_COLOR)
cv2.namedWindow('canvas', cv2.WINDOW_NORMAL)
cv2.imshow('canvas', img) # img 채널순서는 BGR
cv2.waitKey()
cv2.destroyAllWindows()

채널 순서를 BGR로 바꾸니 다시 잘 나온다.

 

※ 주의: matplotlib 라이브러리에서는 채널 순서를 RGB 형태로 입력해주어야한다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기