OpenCV 이미지 프로세싱

사진 처리 첫걸음

배울 함수

cv2.imread()

cv2.imshow()

cv2.imwrite()

cv2.waitKey()

cv2.namedWindow()

cv2.destroyWindows()

cv2.destroyAllWindows()

사진 읽기

사진을 읽어보아요.

workon cv

로 virtualenv에 진입해요. 현재 디렉토리에 아무 사진이나 하나 넣으세요. 저는

이 열기구 사진으로 할게요. 이름은 ballon.jpg 예요.

다음과 같은 파이썬 코드를 실행해요. 터미널에서 한 줄씩 쳐도 상관없어요.

import numpy as np
import cv2

img=cv2.imread('ballon.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imread()는 파일 경로가 잘못되면 오류를 raise하지 않고 None을 return해요.

사진 보이기

사진을 읽기는 읽었는데 이것만으로는 아무것도 할 수가 없죠? 사진을 화면에 보여보아요.

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

짠! 흑백이 되었어요. cv2.imread('ballon.jpg', cv2.IMREAD_GRAYSCALE)의 두 번째 argument  cv2.IMREAD_GRAYSCALE 때문이에요. cv2.imread는 첫 번째로 사진 파일 경로를 받고, 두 번째 argument로는 다음 세 가지를 받아요.

cv2.IRMEAD_GRAYSCALE: 우리가 방금 한 거예요. 사진을 흑백으로 읽어요. 0으로도 대체할 수 있어요.

cv2.IMREAD_COLOR: 사진을 유색으로 읽을 수 있는데, 투명도가 다 무시되어요. cv2.imread()의 기본값은 이거예요. 1로도 대체할 수 있어요.

cv2.IMREAD_UNCHANGED: 사진을 있는 그대로 읽어요. BGR 채널뿐만 아니라 투명도 채널까지 읽혀요. -1로도 대체할 수 있어요.

cv2.imshow()는 창(Window)을 하나 띄워서 사진을 보여주어요. 첫 번째 argument 는 창의 이름이고요, 두 번째 argument는 사진 객체(img)예요. 이 객체의 타입을 Mat라고 해요. 창 크기는 기본적으로 사진 크기에 맞춰져요.

cv2.waitKey()함수는 argument 하나를 int로 받아서 밀리초만큼 키보드 입력을 기다려요. 그러니까 cv2.waitKey(300)은 300밀리초(0.3초)만큼 키보드 입력을 기다리게 되죠. 0을 받으면 키보드 입력이 들어올 때까지 무한정 기다려요. 프로그램이 cv2.imshow()를 하자마자 곧바로 종료되는 것을 막기 위함이지만, 나중에 다른 용도로도 쓰여요.

cv2.waitKey()함수가 키보드 입력을 받아 종료되면 cv2.destroyAllWindows()가 실행이 되어요. 지금까지 열렸던 모든 창을 다 닫아요.

창을 미리 띄워놓고 사진을 나중에 불러와야 할 때가 있어요. 그럴 때는 cv2.namedWindow()를 쓰면 되어요.

cv2.namedWindow('later')
cv2.imshow('later', img)

cv2.imshow()가 창 크기를 사진 크기에 맞춰 주는 것과 달리 cv2.namedWindow()는 사진 크기를 설정할 수 있어요. 사진이 너무 크다면 cv2.WINDOW_NORMAL을 두 번째 argument로 주어요.

cv2.namedWindow('Too Large!', cv2.WINDOW_NORMAL)

cv2.namedWindow()의 기본값은 cv2.WINDOW_AUTOSIZE예요.

특정한 창 하나만 닫고 싶다면 cv2.destroyWindow()를 쓰면 되어요.

사진 저장하기

cv2.imwrite('BallonInGray.jpg', img)

간단하죠? 파이썬은 이래서 좋아요.

숙제

사용자에게서 사진 경로와 흑백/유색 여부를 입력받아 그대로 띄우고, s를 누르면 저장하고 닫고 ESC를 누르면 그냥 닫는 프로그램을 만들어보아요.

댓글

댓글 본문