OpenCV (2)

Myeongsu Moon·2024년 11월 30일
0

제로베이스

목록 보기
29/95
post-thumbnail

Chapter2 OpenCV 기초 개념과 연산 기초 개념과 연산

이미지 기초 개념

  • Pixel: Picture Element (화소)

  • 한 픽셀은 RGB로 구성되어 있음

  • 해상도: 화소 수

  • 배열로 표현해서 가로, 세로가 뒤집혀서 나올 수 있음

  • 이미지에서 원점은 좌측 상단

  • ROI 추출 (Region of Interest, 관심 영역)

import cv2 as cv

# 이미지 불러오기
img_path = "./파일명.png"
img = cv.imread(img_path)

# ROI를 지정할 영역의 좌표 (x, y, width, height)
x, y, w, h = 100, 100, 200, 400  # ex 좌표

# ROI 추출
roi = img[y:y+h, x:x+w]

# ROI 표시하기
cv.imshow('ROI', roi)
cv.waitKey(0)
cv.destroyAllWindows()

# ROI 저장하기
cv.imwrite('roi_image.jpg', roi)
  • 색상공간: 색을 표현하는 방법을 정의한 것으로, 컴퓨터 시스템이 이미지의 색을 인식하고 처리하는 방식을 결정
  • RGB, CMYK, HSV, HSV, YCbCr 등..
  • R 채널만 살려보기
  • OpenCV 배열은 RGB순이 아닌 BGR순서
import cv2 as cv

# 이미지 불러오기
img_path = "./example_512.png"
img = cv.imread(img_path)

img_R = img.copy()

# 다른 채널 값 제거
img_R[:, :, 0] = 0
img_R[:, :, 1] = 0

cv.imshow('Original', img)
cv.imshow('Red Channel', img_R)
cv.waitKey(0)
cv.destroyAllWindows()

이미지 기초 연산

  • 연산: 데이터에 대해 수행되는 계산이나 조작(산술, 논리, 관계, 할당, 접근 등)
  • 색상 반전
import cv2

img = cv2.imread('resized_Checkerboard.png')

# 이미지를 반전시키기 위해 RGB 값을 255에서 뺍니다
inverted_img = 255 - img

cv2.imshow('original Image', img)  # 'original Image' 창
cv2.imshow('Inverted Image', inverted_img)  # 'Inverted Image' 창

cv2.waitKey(0)
cv2.destroyAllWindows()

  • 만약 덧셈으로 표현한다면?
import numpy as np
import cv2

src = cv2.imread('이미지.png')

add_value = 255

added_img = src + add_value

cv2.imshow('src', src)
cv2.imshow('added_img', added_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

-> Wrap Around
-> uint8 데이터 타입은 0~255까지의 값을 저장할 수 있음
-> 255를 초과하는 값을 저장하려하면 그 값은 256으로 나눈 나머지로 'wrap around' 됨
-> Modular. Mod. (모듈로 연산)

  • 밝기 조절을 위한 덧셈은 다르게 해야 함
cv.add(src1, src2[, dst[, mask[, dtype]]]) -> dst

-> src1, src2: 더할 두 입력 배열 (주로 이미지 데이터)
-> dst (선택): 출력 배열 입력과 같은 크기와 타입이어야 함, 대부분 생략
-> mask (선택): 연산을 적용할 영역을 정의하는 마스크 배열
-> dtype (선택): 출력 데이터 타입

import numpy as np
import cv2

src = cv2.imread('example_512.png')

add_value = 100

added_img02 = cv2.add(src, np.full(src.shape, add_value, dtype=np.uint8))

cv2.imshow('src', src)
cv2.imshow('added_img', added_img02)

cv2.waitKey(0)
cv2.destroyAllWindows()

  • 어둡게 만들기 위해서는
sub_value = 100

sub_img = cv2.subtract(src, np.full(src.shape, sub_value, dtype=np.uint8))

이미지 색상 공간 변환

  • 그레이스케일(grayscale)영상: 흑백사진처럼 색상 정보가 없이 밝기 정보만으로 구성, 256단계로 표현
  • 트루컬러(truecolor)영상: 컬러사진처럼 색상 정보를 가지고 있어서 다양한 색상 표현, RGB색 성분을 256단계로 표현, 16,777,216 색상 표현 가능

  • 흑백사진으로 변환

import cv2

src = cv2.imread('example_512.png')

# RGB 이미지를 그레이스케일로 변환합니다.
gray_img = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

cv2.imshow('src', src)
cv2.imshow('gray_img', gray_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

  • RGB, CMYK

  • HSL, HSV, HSB, HSI
    -> Hue(색상): 어떤 색인지 결정 0~360도 벙위
    -> Saturation(채도): 색의 강력함 또는 순도, 높은 채도는 색이 더 선명하고 순수함, 낮은 채도는 색이 더 흐림 0~100%로 표현

  • RGB를 HSV로 변환

import cv2

src = cv2.imread('example_512.png')

# RGB 이미지를 HSV로 변환합니다.
hsv_img = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

cv2.imshow('src', src)
cv2.imshow('hsv_img', hsv_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

  • 색상 검출 시 자주 사용됨
  • 파란색 영역만 골라내기
import numpy as np
import cv2

src = cv2.imread('이미지.png')

src_hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

src_blue = cv2.inRange(src_hsv, (110, 0, 0), (130, 255, 255))

cv2.imshow('src', src)
cv2.imshow('src_blue', src_blue)
cv2.waitKey()

cv2.destroyAllWindows()

-> 파란색 부분은 밝게, 파란색 성분이 없는 곳은 어둡게 표현 됨

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다

0개의 댓글