이미지 불러오기
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()

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()

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