1 분 소요

이번에는 OpenCV 기본 연산에 관한 포스팅 입니다.

영상 속 데이터에 대해서 알아보는 방법과, CV 내부 연산자를 이용하여, 영상의 형태를 변환하는 방법을 알아보려 합니다.

OpenCV는 이미지를 불러올 때, imread( ) 함수를 사용하고, 이 이미지의 자료형은 numpy 라이브러리를 사용하여 원하는 자료형으로 변경할 수 있습니다.

자료형으로는 np.uint8, np.int8, np.uint16, np.int16, np.int32, np.float64 등이 있으며, reshape 함수를 사용하여, 원하는 자료형으로 변경 가능합니다.

또한 flatten( )함수가 존재하는데, 이 함수는 다차원 배열을 1차원 배열로 변경해 줍니다.

import cv2
import numpy as np

img = cv2.imread('SamplePicture1.jpg', cv2.IMREAD_GRAYSCALE)
print('img.shape = ', img.shape)

img = img.flatten()
print('img.shape2 = ', img.shape)

img = img.reshape(-1, 250, 250)
print('img.shape3 = ', img.shape)

cv2.imshow('img', img[0])
cv2.waitKey()
cv2.destroyAllWindows()
img.shape =  (250, 250)
img.shape2 =  (62500,)
img.shape3 =  (1, 250, 250)

첫번째 shape는 250 * 250 크기의 영상 입니다. 다시 shape2에서 flatten()함수를 써서, 1차원 배열로 바꾸어 주고, shape3에서 다시 3차원 배열로 변경하는 코드 입니다.

img[100:400, 200:300, 0] = 250
img[100:400, 300:400, 1] = 250
img[100:400, 400:500, 2] = 250

또한 컬러 영상을 불러올 때, BGR 형태로 불러옵니다.

y축 100 ~ 399, x축 200 ~ 299 까지의 영역을 B채널, 100 ~ 399, 300 ~ 399까지의 영역을 G채널, 100 ~ 399, 400 ~ 499까지의 영역을 R채널로 위와같이 지정한 영역만 변경 가능 합니다.

그리고 원하는 영역을 지정하는 함수로는 cv2.selectROI()가 있습니다.

import cv2

src = cv2.imread('SamplePicture1.jpg', cv2.IMREAD_GRAYSCALE)
roi = cv2.selectROI(src)

if roi != (0,0,0,0):
    img = src[roi[1]:roi[1] + roi[3],
              roi[0]:roi[0] + roi[2]]
    
    cv2.imshow('img', img)
    cv2.waitKey()
    
cv2.destroyAllWindows()

roi[1] : roi[1] + roi[3] 파트는 y축 + height, roi[0] : roi[0] + roi[2] 파트는 x축 + width 입니다.

위 코드는 영역을 지정한 후, 스페이스를 누르면, 그 영역만 따로 출력되는 코드 입니다.

또 영상을 분리, 병합할 수 있는데, 이때 사용하는 함수로는 split(), merge()함수가 있습니다.

src = cv2.imread('SamplePicture1.jpg')

b,g,r = cv2.split(src)
dst = cv2.merge([b,g,r])

위와 같이 영상 분리 후 다시 합하는 과정을 거칠 수 있습니다.

그리고 OpenCV에도 연산자가 존재합니다. 사칙연산으로는 ‘+’ 혹은 add( ), substract( ), divide( ).

비트연산으로는 bitwise_not( ), bitwise_or( ), bitwise_xor( ). 등

더 많은 연산자가 존재하는데, 너무 많아서 자주 쓰는 연산자는 익혀둬야겠습니다.

’+’ 연산자는 uint8 자료형 기준, 화소 값이 255가 넘는 경우, 256으로 나눈 나머지를 가지게 됩니다.
이와 다르게, add( )연산자는 화소 값 255가 넘는 경우, 최대값 255를 저장하게 됩니다.
그래서 영상 출력 시, 조금 다르게 출력 됩니다.
연산을 하기 전, 화소 값을 잘 확인해봐야겠습니다.



후기: 파이썬 프로그래밍 기초에서 조금 활용한 것이어서 아직까지는 할만 한 것 같습니다. 앞으로도 계속… 그랬으면 좋겠다… ㅎㅎ

업데이트: