본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 영상(Image)과 영상의 입출력, 복사하기

by coding-choonsik 2023. 7. 24.
728x90
반응형
SMALL

1. 영상(Image)


1-1. 픽셀(pixel)

  • 이미지를 구성하는 가장 작은 단위
  • 바둑판 모양의 격자에 나열되어 있는 형태, 2차원 행렬

 

1-2. 그레이스케일 영상

  • 흑백사진처럼 색상 정보가 없는 영상
  • 밝기 정보만으로 구성된 영상
  • 밝기 정보는 256단계로 표현(0 ~ 255)
  • numpy.uint8 = 8bit = 1byte
    • uint8(unsigned 8-bit integer): 음수 값을 허용하지 않음(0~255)
  • 용량 = 가로크기 * 세로크기 = 28 * 28 = 784bytes(28픽셀일 때)
import cv2

img_gray = cv2.imread('dog.bmp', cv2.IMREAD_GRAYSCALE)
print('img_gray type: ', type(img_gray))  # <class 'numpy.ndarray'>
print('img_gray shape: ', img_gray.shape)  # (364, 548) ➡ (h, w) 순서
print('img_gray dtpye: ', img_gray.dtype)  # uint8(양수만 가능한 0 ~ 255)

>>> img_gray type:  <class 'numpy.ndarray'>
img_gray shape:  (364, 548)
img_gray dtpye:  uint8

1-3.  트루컬러 영상

  • 컬러사진처럼 색상 정보를 가지고 있기 때문에 다양한 색상을 표현할 수 있는 영상
  • red, green, blue 색 성분을 사용하고, 각 256단계로 표현
  • 픽셀의 표현 -> 튜플 형태로 (255, 255, 255)
  • numpy.ndarray = 3byte
  • 용량 = 3 * 가로크기 * 세로크기 = 3 * 28 * 28 = 2352bytes(28픽셀일 때)
import cv2

img_color = cv2.imread('dog.bmp')
print('img_color type: ', type(img_color))  # <class 'numpy.ndarray'>
print('img_color shape: ', img_color.shape)  # (364, 548, 3)
print('img_color dtype: ', img_color.dtype)  # uint8(양수만 가능한 0 ~ 255)

>>> img_color type:  <class 'numpy.ndarray'>
img_color shape:  (364, 548, 3)
img_color dtype:  uint8

# img_color의 가로*세로 형태로 출력
h, w = img_color.shape[:2]
print('img_color의 사이즈: {} * {}'.format(w, h))

>>> img_color의 사이즈: 548 * 364

 

✅ 그레이스케일 영상과 컬러 영상을 구별하는 방법

if len(img_gray.shape) == 2:   # 3일 경우는 컬러
    print('img_gray는 그레이스케일 영상입니다')
elif len(img_gray.shape) == 3:
    print('img_gray는 컬러영상 입니다')

 

📍영상을 특정 픽셀값으로 채우기

  • np.empty((h, w), dtype)
  • np.zeros((h, w), dtype)
  • np.ones((h, w), dtype)
  • np.full((h,w,c), (채울 픽셀 값들), dtype)
import cv2
import numpy as np

img1 = np.empty((240, 320), dtype=np.uint8)  # h,w 순서
img2 = np.zeros((240, 320, 3), dtype=np.uint8)  # 0으로 채운 검은색 영상
img3 = np.ones((240, 320), dtype=np.uint8) * 120  # 120으로 채운 그레이스케일 영상
img4 = np.full((240, 320, 3),(255, 102, 255), dtype=np.uint8)  # 두번째 매개변수로 주어진 수로 기본값 설정


cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey()

▲ img1, img2
▲ img3, img4

✅ 특정 픽셀값으로 컬러영상 띄우기

img_color[:, :] = (255, 102, 255)
cv2.imshow('img_color', img_color)
cv2.waitKey()

▲ (255, 102, 255) 픽셀값으로 채워진 컬러 영

 

 

 



1-4. 영상 파일 형식

  •  bmp
    • 픽셀 데이터를 압축하지 않고 그대로 저장
    • 용량이 매우 큼(픽셀의 일반적인 용량)
    • 파일 구조가 단순해서 별도의 라이브러리 없이 프로그래밍이 가능
  •  jpg, jpeg
    • 압축률이 좋아서 파일 용량이 크게 감소
    • 사진과 같은 컬러영상을 저장
    • 손실 압축
  •  gif
    • 움직이는 영상 지원
    • 256색 이하의 영상을 저장
    • 무손실 압축
  •  png
    • 웹 이미지용으로 권장
    • 무손실/손실 압축
    • 알파 채널(투명도)을 지원, (255, 255, 255, 1)
    • 용량 = 가로크기 * 세로크기 * 4(알파채널까지)

 


1-5. 영상 출력

  • 그레이스케일 영상 출력
    •  cv2.IMREAD_GRAYSCALE 옵션을 사용
    • img.shape: 차원의 크기를 나타냄, (h, w)
    •  plt.imshow() 함수에서 컬러맵(cmap)을 gray로 설정
  •  컬러 영상 출력
    • cv2.imread() 메소드로 불러온 영상의 색상 정보는 BGR 순서
    • matplotlib에서 출력하려면 RGB 순서로 변경해야 하기 때문에 cv2.cvtColor() 메소드를 사용하여 변경
    • img.shape: 차원의 크기를 나타냄, (h, w, 3)

 

 


✅ matplotlib 라이브러리를 이용하여 컬러영상과 그레이스케일영상을 subplot으로 띄워보자.

img_gray = cv2.imread('dog.bmp', cv2.IMREAD_GRAYSCALE)
img_rgb = cv2.imread('dog.bmp', cv2.IMREAD_COLOR)
img_rgb = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB)

plt.subplot(121)
plt.axis('off')
plt.imshow(img_gray, cmap='gray')

plt.subplot(122)
plt.axis('off')
plt.imshow(img_rgb)
plt.show()


1-6. copy()

import cv2

img_origin = cv2.imread('dog.bmp')

img_copy = img_origin[91:210, 125:245].copy()

cv2.imshow('img_origin', img_origin)
cv2.imshow('img_copy', img_copy)
cv2.waitKey()

▲ 특정 픽셀을 슬라이싱하여 copy

 

728x90
반응형
LIST