[OpenCV] 02-1. Getting started with Images
🐍Python/OpenCV

[OpenCV] 02-1. Getting started with Images

728x90
반응형

<2-1. Getting started with Images>

이번 2-1에서는 cv2.imread() , cv2.imshow(), cv2.imwrite()에 대해서 배울 것이다. 그리고 matplotlib을 이용해서 이미지를 나타낼 것이다!

Using OpenCV

Read an image

  • cv2.imread(filename, flag)

이미지를 읽기 위한 기능이다. 이미지는 작업 폴더내에 있어야 하거나 이미지의 전체 경로가 주어져야한다.

그리고 이미지를 어떤 방식으로 읽을 지도 정해주어야 한다. 대표적으로 사용하는 flags들은 다음과 같다.

(1) cv2.IMREAD_COLOR : 컬러 이미지를 불러온다. 이미지의 투명성은 무시되고, 이것이 기본값이다.

(2) cv2.IMREAD_GRAYSCALE : 흑백 모드로 이미지를 불러온다.

(3) cv2.IMREAD_UNCHANGED : alpha 채널을 포함한 이미지를 불러온다.

이들은 간단하게 1,0,-1로 각각 불러올 수도 있다.

import numpy as np
import cv2

# 컬러 스케일로 불러온다 = 1
img = cv2.imread('golden.jpg',1)

여기서 이미지를 나타낼 때 print()문으로는 안된다.

Display an image

  • cv2.imshow(‘windowname’, img)

이미지를 나타낼 때 사용하는 것이 바로 cv2.imshow()이다. 새로운 창을 띄우는데 이 창의 크기는 자동으로 이미지의 크기에 맞춘다.

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

(1) cv2.waitKey() : 이 때, 아무 키보드 버튼이나 누르면 창은 종료된다. (jupyter notebook 상에서는 * 표시가 사라지고 다시 작업을 가능케 한다. 새로 뜬 창은 사라지지 않기 때문에 이것이 거슬린다면 matplotlib를 쓰는게 나을 것 이다. plt가 RGB를 받고 CV가 BGR을 받아서 채널을 거꾸로 해준뒤 출력해야한다. )

(2) cv2.destroyAllWindows() : 생성한 창들을 다 제거한다. 특정 창을 제거하고 싶다면 cv2.destroyWindow()를 사용하면 된다.

(3) cv2.namedWindow() : 미리 창을 만들고 나중에 이미지를 로드할 수 있는 경우가 있다. 이 경우에는 창의 크기를 조정할 수 있다. cv2.namedwindow() 함수를 사용한다. 기본적으로 flag는 cv2.WINDOW_AUTOSIZE이다. 하지만 특별한 경우에는 cv2.WINDOW_NORMAL을 사용하여 창을 resize한다. 이미지가 매우 크거나 트랙 바를 창에 추가할 때 도움이 된다.

Write an image

  • cv2.imwrite(filename, img)
cv2.imwrite('golden2.jpg',img)

저장하고 싶은 이름을 먼저 쓰고, 저장하고 싶은 이미지를 그 다음에 입력하면 된다.

종합

import numpy as np
import cv2

img = cv2.imread('golden.jpg',1)
cv2.imshow('image',img)
k = cv2.waitKey(0)
#esc를 눌렀을 때 27를 반환한다.
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('golden2.jpg',img) 
    # s를 눌렀을 때는, 이미지를 저장하고 종료
    cv2.destroyAllWindows()

Using Matplotlib

Matplotlib는 파이썬의 시각화 툴이다.
앞서 말한 것 처럼 cv2로 읽어온 이미지를 제대로 출력하기 위해서는 다음과 같이 해야한다.

plt.imshow(img)
plt.axis('off')
plt.show()


그냥 img로 불러왔기에 컬러 채널이 맞지 않다.

plt.imshow(img[:,:,::-1])
plt.axis('off')
plt.show()


맨 마지막의 채널을 BGR에서 RGB로 바꿔줘야 제대로 출력을 할 수 있다.

728x90
반응형