pip install opencv-python
imread
로 파일 읽어오면, Numpy 배열(numpy.ndarray)로 리턴 됩니다. imshow
함수의 경우 윈도우 창을 새로 띄우기 거기에 이미지를 보여주는데요. 여러개 이미지를 띄우려면, 창 이름을 각기 다르게 지정해줘야 합니다. imshow
함수는 BGR로 색상을 불러오기 때문에 cv2.cvtColor
이용하여 RGB로 변경해야 원래 색상으로 볼 수 있습니다.
image = cv2.imread('./images/klimt.jpg', cv2.IMREAD_COLOR)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('image', image)
cv2.imshow('rgb_image', rgb_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# ESC로 창 닫을 수 있도록 waitkey 설정
for i in range (1,5):
cv2.waitKey(1)
윈도우 창으로 이미지 띄우면, 매번 닫아줘야 하는 번거로움이 있는데요. matplotlib.pyplot
을 이용하여 jupyter notebook에서 쉽게 확인하는데 더 편합니다.
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title('image')
plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2)
plt.imshow(rgb_image)
plt.title('rgb_image')
plt.xticks([]), plt.yticks([])
plt.show()
[출력]
print(f'이미지 사이즈 : {format(image.shape)}')
print(f'이미지 dtype : {format(image.dtype)}')
print(f'이미지 Width : {format(image.shape[1])}')
print(f'이미지 Height : {format(image.shape[0])}')
[출력]
이미지 사이즈 : (778, 500, 3)
이미지 dtype : uint8
이미지 Width : 500
이미지 Height : 778
import cv2, sys
import numpy as np
src = cv2.imread('./images/klimt.jpg')
if src is None:
print("Image load failed")
sys.exit()
img1 = cv2.resize(rgb_image, (1280, 1920))
img2 = cv2.resize(rgb_image, (1280, 1920), interpolation=cv2.INTER_LANCZOS4)
# x,y 비율로 설정하기
img3 = cv2.resize(rgb_image, dsize=(0,0), fx=0.5, fy=0.3, interpolation=cv2.INTER_AREA)
images = [img1, img2, img3]
title = ['INTER_LINEAR' ,'INTER_LANCZOS4' ,'INTER_AREA']
for i in range(3):
plt.subplot(1, 3, i+1)
plt.imshow(images[i])
plt.title(title[i])
plt.xticks([]), plt.yticks([])
plt.show()
[출력]
image = rgb_image[460:600, 20:480]
plt.imshow(image)
plt.title('crop')
plt.xticks([]), plt.yticks([])
plt.show()
[출력]
cv2.getRoatateMatrix2D(center, angel, sacle)
- center : 회전 중심 좌표, (x, y) 튜플
- angle : (반시계 방향) 회전 각도. (음수 설정 시 시계방향)
- scale : 추가적 확대 비율
* return value : 2x3 어파인 변환 행렬, 실수형
cv2.warpAffine
함수에 입력해주면 이동 변환cv2.warpAffine(src, M, dsize, flags)
- src : 입력 이미지
- M : 앞서 구한 2x3 어파인 변환 행렬
- dsize : 결과 영상 크기, (w, h) 튜플, (0, 0)이면 src와 같은 크기로 설정
- flags : 보간법. 기본값은 cv2.INTER_LINEAR
copy = (rgb_image.shape[1] / 2, rgb_image.shape[0] / 2)
# 이미지 중심점 기준으로 45도 회전하면서 1.5배 확대
rotate = cv2.getRotationMatrix2D(copy, 45, 1.5)
image = cv2.warpAffine(rgb_image, rotate, (0,0))
[출력]
img1 = cv2.flip(rgb_image, 1) # FLIP_LEFT_RIGHT
img2 = cv2.flip(rgb_image, 0) # FLIP_TOP_BOTTOM
img3 = cv2.flip(rgb_image, -1) # FLIP_LEFT_RIGHT_TOP_BOTTOM
[출력]
openCV의 경우 한글을 지원하지 않아 텍스트에 한글 입력시 '???' 형태로 깨져서 출력됩니다. 한글 출력시 Pillow 등 사용하여 별도 설정이 필요합니다.
bbox_image = rgb_image.copy()
bounding_box = (30, 610, 140, 60)
x1, y1, w, h = bounding_box
pt1 = (int(x1), int(y1))
pt2 = (int(x1+w), int(y1+h))
cv2.rectangle(bbox_image, pt1, pt2, (0, 255, 0), 1)
cv2.putText(bbox_image, 'Title', (x1, y1 - 15), cv2.FONT_HERSHEY_DUPLEX, 1, (0,255,0))
plt.figure(figsize=(8, 5)) # 전체 Figure 사이즈 설정
plt.imshow(bbox_image)
plt.title('bbox_image')
plt.xticks([]), plt.yticks([])
[출력]