화소값은 어떻게 행렬에 저장될까?
크기가 n행 X m열인 그레이스케일(grayscale) 영상 데이터는 첫부분에 화소(0,0)의 값이 저장된다. 이어서 화소 (0,1)의 값이 저장되고, 이런식으로 화소값이 순차적으로 저장되다가 맨끝에 화소 (n-1, m-1)의 값이 저장된다.
컬러 영상에서는 저장할 때 우리가 선택할 수 있는 방법이 몇가지가 있다.
가장 기본적인 방법은 컬러를 세가지의 기본색으로 나누고 이를 조합하여 다른 컬러를 만드는 방법이다. 많이 사용되는 기본 색상이 RGB이다.
화소의 자료형은 우리가 선택할 수 있다. 부호가 없으면 8비트의 경우 0~255까지의 값을 저장할 수 있고, 부호가 있다면 -127~127사이의 값을 저장할 수 있다.
보통 BGR컬러 영상의 경우 8비트 자료형을 사용하여 색상을 표현하는 것이 일반적이나, 정밀도를 위하여 각 채널을 float(32비트) 또는 double(64비트)자료형을 사용하여 더 세밀하게 표현할 수도 있다. 이 경우에는 영상을 저장하는 메모리의 크기도 커진다.
import cv2
import numpy as np
blank_img = np.zeros((512, 512), dtype=np.uint8)
blank_img = np.ones((512,512), dtype=np.uint8)
blank_img = np.full((512,512), 255, dtype=np.uint8)
blank_img = np.random.random((512,512)) * 255
plt.imshow(blank_img, cmap="gray")
우리는 가끔 영상의 일부에만 어떤 처리를 적용하고 싶은 경우가 있다. 우리가 관심을 가지는 영상의 일부를 관심영역(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()는 행렬의 크기를 변경한다. 새로운 행의 개수가 기존의 행 개수보다 작으면 남는 행은 삭제된다.
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()은 화소의 전체 개수는 변경하지 않으면서 영상의 모양을 변경하는 함수이다. 예를들어서 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)