질문이 있으십니까?

기본 컨텐츠 및 사용자가 직접 참여하여 만들어진 다양한 내용을 검색합니다.

opencv 패키지 유용한 함수 10개 정리

OpenCV은 영상처리 및 컴퓨터비전에 관한 대표적인 패키지입니다. OpenCV의 유용한 함수들이 뭐가 있는지 살펴보도록 하겠습니다. 파이썬의 힘은 이런데 있습니다. 아래의 구현을 하려면, 쉽지 않은 코딩이 필요하지만, OpenCV는 완성되고 발달되어 너무 쉽고 편리하게 우리가 만들려고 하는것을 도와줍니다.

1. 이미지 읽기: cv2.imread()

컬러 이미지를 읽으려면 cv2.IMREAD_COLOR를, 그레이스케일 모드로 읽으려면 cv2.IMREAD_GRAYSCALE을 입력해주시면 됩니다. 참고로 opencv-python에서 컬러이미지는 BGR 순서로 구성되어 있음을 주의하세요.^^

2. 이미지 컬러 공간 변환: cv2.cvtColor()

BGR 색공간을 gray-scale로 변환하고 싶은 경우에는 cv2.COLOR_BGR2GRAY를, BGR 색공간을 HSV 색공간으로 변환하고 싶은 경우에는 cv2.COLOR_BGR2HSV를 선택하시면 됩니다. 2개만 예로 들었는데 150개 이상의 색공간 변환 기능을 지원한다고 합니다.

3. 이미지 사이즈 변경: cv2.resize()

이미지를 축소시킬 때는 보간법(interpolation) 설정을 cv2.INTER_AREA로 해주는 것을, 확대시킬 때는 cv2.INTER_CUBIC 또는 cv2.INTER_LINEAR를 사용할 것을 권장합니다. cv2.INTER_CUBIC보다는 cv2.INTER_LINEAR가 좀 더 빠릅니다.

4. 이미지 보여주기: cv2.imshow()

보통 cv2.waitKey(0), cv2.destroyAllWindows()와 같이 다닙니다.

5. 이미지 저장: cv2.imwrite()

위 다섯 함수들을 모두 사용한 예제 코드는 다음과 같습니다. 컬러 이미지를 읽은 후 그레이스케일로 변환했고, 그 이미지를 가로, 세로 각각 반으로 줄였고, 마지막으로 그것을 result.jpg라는 이름의 파일로 저장했습니다.
import cv2

#이미지읽기
img_color = cv2.imread('rest1.jpg', cv2.IMREAD_COLOR)

#컬러 이미지를 그레이스케일로 변환
img_gray = cv2.cvtColor(img_color, cv2.COLOR_RGR2GRAY)

#이미지 사이즈 변경
img_gray_reduced = cv2.resize(img_gray, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
#가로,세로 모두 반으로 줄이

#이미지 보여주기
cv2.imshow('color', img_color) #color라는 이름의 윈도우 안에 img_color라는 이미지를 보여줌
cv2.imshow('gray-scale', img_gray)
cv2.imshow('gray-scale reduced', img_gray_reduced)

cv2.waitKey(0)
cv2.destroyAllWindows()

#이미지 저장(img_gray_reduced를 result.jpg 파일로 저장)
cv2.imwrite('result.jpg', img_gray_reduced)

6. 선, 사각형, 원, 타원 그리기: cv2.line(), cv2.rectangle(), cv2.circle(), cv2.ellipse()

7. 텍스트 넣기: cv2.putText()

import cv2
 
# 이미지 읽기
img = cv2.imread('test1.jpg', cv2.IMREAD_COLOR)
 
# 사각형 그리기
img = cv2.rectangle(img, (350, 25), (610, 230), (255, 0, 0), 3)
# 사각형을 그릴 이미지, 사각형의 좌측상단좌표, 우측하단좌표, 테두리 색, 테두리 두께
img = cv2.rectangle(img, (490, 180), (760, 360), (255, 0, 0), 3)
img = cv2.rectangle(img, (390, 380), (670, 530), (255, 0, 0), 3)
img = cv2.rectangle(img, (110, 180), (365, 480), (0, 255, 0), 3)
 
# 텍스트 넣기
cv2.putText(img, 'Coffee', (360, 220), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
# 텍스트를 넣을 이미지, 텍스트 내용, 텍스트 시작 좌측하단좌표, 글자체, 글자크기, 글자색, 글자두께, cv2.LINE_AA(좀 더 예쁘게 해주기 위해)
cv2.putText(img, 'Coffee', (500, 350), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
cv2.putText(img, 'Coffee', (400, 520), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2, cv2.LINE_AA)
cv2.putText(img, 'Cake', (120, 470), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA) 

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

8. 이미지 채널분리: cv2.split()

9. 이미지 채널 병합: cv2.merge()

import cv2
 
# 이미지 읽기
img = cv2.imread('test1.jpg', cv2.IMREAD_COLOR)
 
# 이미지 사이즈 축소
img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
 
cv2.imshow('original image', img)
 
# 색공간 변환
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR 색공간을 HSV로
 
# 이미지 채널 분리
(H, S, V) = cv2.split(img)
 
cv2.imshow('Hue channel', H)
cv2.imshow('Saturation channel', S)
cv2.imshow('Value channel', V)
 
# Hue 채널값 변화주기
H = H//2;
 
# 이미지 채널 병합
HSV = cv2.merge((H, S, V))
 
# 색공간 변환
img = cv2.cvtColor(HSV, cv2.COLOR_HSV2BGR)
 
cv2.imshow('new image', img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

10. 값의 범위 바꿔주기: cv2.normalize()

영상처리를 하다보면 값의 범위를 바꿔줘야할 경우가 꽤 자주 있습니다. 0-255 범위의 값을 0-1로 매핑해줘야할 때도 있고, 0-1 범위의 값을 0-255로 바꿔줘야할 때도 있습니다. cv2.normalize() 함수가 그런 용도로 사용될 수 있습니다. 아래 예제는 1부터 10까지의 정수를 0-1의 범위로 바꿔준 것과 0-255의 범위로 바꿔준 것을 포함합니다.
>>> import cv2
>>> import numpy as numpy
>>> A = np.float64(np.array([1,2,3,4,5,6,7,8,9,10]))
>>> print(A)
array([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])

>>> B = np.float64(np.zeros((10)))
>>> print(B)
array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])

>>> cv2.normalize(A,B,0,1,cv2.NORM_MINMAX)
>>> print(B)
array([0.        , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
       0.55555556, 0.66666667, 0.77777778, 0.88888889, 1.        ])

>>> cv2.normalize(A,B,0,255,cv2.NORM_MINMAX)
>>> print(B)
array([0.          ,  28.33333333,  56.66666667,  85.        ,
       113.33333333, 141.66666667, 170.        , 198.33333333, 
       226.66666667, 255.        ])

댓글을 작성하세요

문서 이력

  • 2020-06-12 날짜로 신달수 님으로 부터 컨텐츠명이 변경 되었습니다.
  • 2020-06-14 날짜로 신달수 님께서 등록 작업을 하였습니다.