OpenCV의 기초

Seungpil Choi·2022년 7월 18일
0

OpenCV의 기초

화소 데이터가 저장되는 방법

화소값은 어떻게 행렬에 저장될까?

  • 크기가 n행 X m열인 그레이스케일(grayscale) 영상 데이터는 첫부분에 화소(0,0)의 값이 저장된다. 이어서 화소 (0,1)의 값이 저장되고, 이런식으로 화소값이 순차적으로 저장되다가 맨끝에 화소 (n-1, m-1)의 값이 저장된다.

  • 컬러 영상에서는 저장할 때 우리가 선택할 수 있는 방법이 몇가지가 있다.
    가장 기본적인 방법은 컬러를 세가지의 기본색으로 나누고 이를 조합하여 다른 컬러를 만드는 방법이다. 많이 사용되는 기본 색상이 RGB이다.

    • OpenCV에서는 BGR컬러 시스템을 사용한다. OpenCV에서 하나의 컬러를 채널(Channel)이라고한다. 3개의 채널이 있다면 각 화소당 3개의 숫자가 저장되는것이다.
  • 화소의 자료형은 우리가 선택할 수 있다. 부호가 없으면 8비트의 경우 0~255까지의 값을 저장할 수 있고, 부호가 있다면 -127~127사이의 값을 저장할 수 있다.

  • 보통 BGR컬러 영상의 경우 8비트 자료형을 사용하여 색상을 표현하는 것이 일반적이나, 정밀도를 위하여 각 채널을 float(32비트) 또는 double(64비트)자료형을 사용하여 더 세밀하게 표현할 수도 있다. 이 경우에는 영상을 저장하는 메모리의 크기도 커진다.

명시적으로 numpy 객체 만들기

모든 셀이 0인 객체 생성

import cv2
import numpy as np

blank_img = np.zeros((512, 512), dtype=np.uint8)
  • 출력
    array([[0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0],
    ...,
    [0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)

모든 셀이 1인 객체 생성

blank_img = np.ones((512,512), dtype=np.uint8)
  • 출력
    array([[1, 1, 1, ..., 1, 1, 1],
    [1, 1, 1, ..., 1, 1, 1],
    [1, 1, 1, ..., 1, 1, 1],
    ...,
    [1, 1, 1, ..., 1, 1, 1],
    [1, 1, 1, ..., 1, 1, 1],
    [1, 1, 1, ..., 1, 1, 1]], dtype=uint8)

두번째 인수로 채워진 객체 생성

blank_img = np.full((512,512), 255, dtype=np.uint8)
  • 출력
    array([[255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255],
    ...,
    [255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)

랜덤함수로 수가 채워진 객체 생성

blank_img = np.random.random((512,512)) * 255
plt.imshow(blank_img, cmap="gray")

관심 영역(ROI, Region Of Interest) 지정하기

우리는 가끔 영상의 일부에만 어떤 처리를 적용하고 싶은 경우가 있다. 우리가 관심을 가지는 영상의 일부를 관심영역(Region Of Interest)라고 한다.

1. 관심 영역 지정

img = cv2.imread('lena.png')
img.shape

roi = img[10:100, 10:100, :]
plt.imshow(roi)

2. 관심 영역 검은색으로 변경


roi *= 0
plt.imshow(img)

영상의 속성 변경하기

resize()

resize()는 행렬의 크기를 변경한다. 새로운 행의 개수가 기존의 행 개수보다 작으면 남는 행은 삭제된다.

img = cv2.imread('lena.png')
img.shape # (256, 256, 3)

resize_img = cv2.resize(img,(200,200))
resize_img.shape # (200, 200, 3)

plt.imshow(resize_img)

reshape()

reshape()은 화소의 전체 개수는 변경하지 않으면서 영상의 모양을 변경하는 함수이다. 예를들어서 10 X 10 영상을 1 X 100 영상으로 변경이 가능하다. 기계학습을 구현할 때 이 함수를 유용하게 사용한다. 기계학습에서 학습벡터들은 모두 1 X 100 형태의 행렬이어야 하기 때문이다.

img = cv2.imread('lena.png') # (256, 256, 3)
reshape_img = img.reshape((128,512,3))
plt.imshow(reshape_img)

이미지 붙이기

수평으로 붙이기

stack_img = np.vstack((img,img))
plt.imshow(stack_img)
stack_img.shape #(512, 256, 3)

수직으로 붙이기

hstack_img = np.hstack((img,img))
plt.imshow(hstack_img)
hstack_img.shape #(256, 512, 3)

0개의 댓글