영상처리 기초 - 1.컴퓨터비전 기초

김민수·2025년 3월 2일
0
post-thumbnail
# 본 자료는 이수안 교수님(https://suanlab.com/)의 자료를 기반으로 수정 및 보완하여 제작되었습니다.
# 제작자 : 김민수(rlaalstn1504@naver.com)

컴퓨터 비전 (Computer Vision) 이란?

1. 개요

  • 컴퓨터 비전은 컴퓨터가 디지털 이미지를 이해하고 분석하여 의미 있는 정보를 추출하도록 하는 학문 및 기술 분야입니다.
  • 인간의 시각 시스템처럼 이미지나 비디오를 처리하고 그 안의 객체, 패턴, 또는 행동을 이해하려는 목표를 가지고 있습니다.
  • 컴퓨터 비전은 인공지능(AI)의 하위 분야로, 주로 기계 학습과 딥러닝 기술에 의존합니다.

2. 배경

  1. 배경
  • 컴퓨터 비전은 초기에는 간단한 영상 처리 기술(예: 에지 검출, 히스토그램 분석)을 중심으로 발전했습니다.
  • 2000년대 이후 딥러닝 기술의 발전과 함께 컴퓨터 비전은 비약적으로 발전했습니다.
  • 특히, 합성곱 신경망(CNN) 구조가 컴퓨터 비전 분야에서 큰 성과를 거두면서 기존 방법론을 대체하거나 보완하고 있습니다.

3. 주요 사용 사례

  1. 이미지 분류(Image Classification):
  • 이미지를 입력받아 해당 클래스(예: 고양이, 강아지)를 분류.
  • 예: 구글 포토, 이미지 검색.
  1. 객체 탐지(Object Detection)
  • 이미지 내 특정 객체의 위치와 종류를 식별.
  • 예: 자율 주행 차량의 보행자 탐지.
  1. 이미지 분할(Image Segmentation)
  • 이미지를 픽셀 단위로 분석하여 영역별로 구분.
  • 예: 의료 영상 분석, 위성 이미지 처리.
  1. 얼굴 인식(Face Recognition)
  • 얼굴 특징을 기반으로 개인을 식별.
  • 예: 스마트폰의 얼굴 잠금 해제.
  1. 동작 인식(Action Recognition)
  • 비디오에서 사람의 동작을 인식.
  • 예: 스포츠 비디오 분석, 감시 시스템.
  1. 이미지 생성(Image Generation)
  • GAN(생성적 적대 신경망) 또는 VAE를 사용하여 새로운 이미지를 생성.
  • 예: 딥페이크, 스타일 변환.

컴퓨터 이미지에 대한 이해

1. 컴퓨터 이미지 이해와 컴퓨터 비전의 연계

2. 이미지 파일 포맷과 압축

  • 이미지 데이터는 효율적인 저장과 전송을 위해 압축되어 사용됩니다. JPEG, PNG, GIF와 같은 파일 포맷이 대표적입니다.

  • 주요 포맷:

  1. JPEG (Joint Photographic Experts Group):
  • 손실 압축 방식으로 파일 크기를 줄이는 데 효과적입니다.
  • 세부 정보를 일부 손실하지만 인간의 시각으로 인지하기 어려운 수준으로 처리됩니다.
  1. PNG (Portable Network Graphics):
  • 무손실 압축 방식으로, 이미지 품질이 그대로 유지됩니다.
  • 투명도(알파 채널)를 지원하여 그래픽 처리에 유용합니다.
  1. GIF (Graphics Interchange Format):
  • 애니메이션을 지원하며, 256가지 색상으로 제한되는 간단한 압축 방식입니다.

  • 이러한 압축 방식은 원래의 RGB 데이터를 효율적으로 압축하지만, 손실 압축 방식(JPEG 등)은 원본 데이터와 일부 차이가 발생할 수 있습니다. 압축된 데이터는 화면에 출력되기 전에 해당 포맷의 압축 해제 방식을 통해 RGB 값으로 복구됩니다. 하지만 손실된 데이터는 복구되지 않습니다.

3. 이미지에서 특징(feature)을 학습하는 방법

  • 컴퓨터 비전에서는 이미지 데이터를 입력으로 받아 다양한 작업을 수행합니다. 이를 위해, 이미지의 RGB 값이 컴퓨터가 이해할 수 있는 형태로 변환됩니다.

  • 이미지 데이터를 처리하는 과정:

    1. 데이터 전처리:
    • 이미지를 픽셀 값(RGB)로 변환.
    • 정규화(Normalization): RGB 값을 0 ~ 255 범위에서 0 ~ 1 사이의 값으로 변환하여 딥러닝 모델에 적합하게 만듦.
    • 이미지 크기 조정(Resizing): 네트워크에 맞는 입력 크기로 변환.
    1. 특징 추출:
    • 딥러닝 모델(특히 CNN)에서 이미지를 처리하며 특징(feature)을 학습.
      • 예: 에지(Edge), 텍스처(Texture), 패턴(Pattern) 등.
    • 기존 방법(딥러닝 이전의 방법): 수작업으로 특징을 추출하거나, 필터와 머신러닝 알고리즘을 활용.
    • 에지 검출 필터: 예를 들어, Sobel 필터, Canny Edge Detector 등을 사용하여 이미지의 윤곽선을 추출.
    • 추출된 특징을 사용하여 SVM(Support Vector Machine)이나 KNN(K-Nearest Neighbors) 같은 머신러닝 모델로 분류 작업 수행.
    1. 모델 적용:
  • 이미지 분류(Classification), 객체 탐지(Object Detection), 이미지 분할(Segmentation) 등 다양한 컴퓨터 비전 작업 수행.

  • 딥러닝 모델(특히 CNN)은 입력 이미지를 픽셀의 RGB 값으로 받아서 공간적 정보(Spatial Information)를 학습합니다. 예를 들어, 이미지 분류 모델은 각 픽셀의 RGB 조합과 이들 간의 관계를 학습하여 이미지를 특정 클래스(예: 고양이, 강아지 등)로 분류합니다.

4. 결론

  • 컴퓨터 이미지는 기본적으로 RGB 데이터의 조합으로 구성되며, 다양한 포맷으로 저장 및 전송됩니다. 컴퓨터 비전에서는 이러한 데이터를 처리하여 이미지의 패턴과 의미를 추출하고, 이를 기반으로 분류, 탐지, 생성 등 복잡한 작업을 수행합니다.

  • 기존의 필터나 머신러닝 기반 접근법은 컴퓨터 비전 작업에서 효율적인 방법을 제공했지만, 딥러닝 기반 접근법은 데이터를 기반으로 직접 특징을 학습할 수 있어 더 복잡하고 정교한 작업을 수행할 수 있습니다.

  • 따라서 컴퓨터 이미지의 기초 개념과 함께 전통적인 특징 추출 기법과 딥러닝 방법을 모두 이해하는 것이 컴퓨터 비전의 성공적인 활용에 필수적입니다.

파이썬에서 이미지 처리하기

주요 라이브러리 소개

OpenCV

  • 소개:

    1. OpenCV(Open Source Computer Vision)는 실시간 컴퓨터 비전 및 이미지 처리에 중점을 둔 오픈소스 라이브러리입니다.
    2. 인텔(Intel)에서 개발하였으며, 현재는 전 세계적으로 가장 널리 사용되는 이미지 처리 도구 중 하나입니다.
    3. C++, Python, Java 등 여러 언어를 지원하며, 다양한 운영 체제에서 사용할 수 있습니다.
    4. TensorFlow, PyTorch, Caffe 등의 딥러닝 프레임워크와도 통합이 가능합니다.
    5. 주요 기능
    • 이미지 처리: 필터링, 히스토그램 계산, 에지 검출, 기하학적 변환 등

    • 비디오 분석: 객체 추적, 모션 추정

    • 머신러닝: 사전 정의된 알고리즘(SVM, KNN 등) 제공

    • 딥러닝 지원: 사전 학습된 모델과 ONNX 포맷을 활용한 딥러닝 작업 가능

      [이미지 출처] https://ko.wikipedia.org/wiki/OpenCV

Pillow

  • 소개:

    1. Pillow는 PIL(Python Imaging Library)의 공식적인 확장판으로, Python에서 이미지 작업을 간단하고 직관적으로 수행할 수 있도록 설계된 라이브러리입니다.
    2. 다양한 이미지 파일 포맷(JPEG, PNG, BMP, GIF 등)을 지원하며, 이미지 열기, 저장, 변환, 편집 등이 가능합니다.
    3. 주요 기능
    • 이미지 읽기 및 저장: 다양한 포맷의 이미지를 읽고 저장할 수 있습니다.

    • 파일 형식 변환(예: PNG → JPEG 등)이 가능합니다.

    • 이미지 변환: 크기 조정(Resizing), 회전(Rotation), 색상 변경(Grayscale 변환 등)과 같은 작업을 쉽게 수행할 수 있습니다.

    • 이미지 필터링:블러(Blur), 샤프닝(Sharpening) 등 기본적인 필터링 기능 제공.

    • 텍스트 추가: 이미지를 배경으로 텍스트를 추가하는 기능 지원.

      [이미지 출처] https://www.linkedin.com/pulse/pil-library-functions-rahul-saxena

이미지와 넘파이 (NumPy)

  • 이미지는 컴퓨터에서 픽셀 값의 배열로 표현되며, 이러한 배열은 Python의 NumPy를 사용하여 쉽게 처리할 수 있습니다.

  • 컬러 이미지: 3차원 배열(높이, 너비, 채널)로 표현됩니다. 각 픽셀은 [R, G, B] 값을 가지며, 일반적으로 0~255 범위의 정수로 표현됩니다.

  • 흑백 이미지: 2차원 배열로 표현되며, 각 픽셀은 0~255의 밝기 값으로 나타냅니다.

  • NumPy는 이미지 데이터를 효율적으로 처리하기 위한 강력한 도구를 제공하며, OpenCV와 함께 사용하면 효과적입니다.

  • 코드 참조 : https://opencv-python.readthedocs.io/en/latest/index.html

이미지 읽기와 출력

  • 이미지 파일을 읽고 화면에 출력하기 위해 다양한 라이브러리를 사용할 수 있습니다. 각각의 특징과 적합한 환경을 살펴봅니다.
  1. Pillow (PIL)와 Matplotlib
  • 구글 코랩(Google Colab)이나 Jupyter Notebook 같은 노트북 환경에서 적합합니다.
  • 간단한 이미지 읽기와 시각화에 적합하며, 사용법이 직관적입니다.
  • Matplotlib의 imshow()를 통해 이미지를 출력할 수 있습니다.
  1. OpenCV
  • 주로 Python 스크립트 기반 환경에서 사용됩니다.
  • OpenCV의 cv2.imread() 함수로 이미지를 읽고, cv2.imshow()로 이미지를 출력할 수 있습니다.
  • 다만, Google Colab에서는 OpenCV의 기본 이미지 출력 함수인 cv2.imshow()가 지원되지 않기 때문에, Colab에서는 from google.colab.patches import cv2_imshow를 사용해야 합니다.
  • OpenCV는 이미지뿐 아니라 동영상 처리도 지원하지만, Colab에서는 동영상 관련 작업은 제약이 있습니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from PIL import Image
import requests
from io import BytesIO
# url과 Image객체를 활용하여 이미지 읽기
url = 'https://cdn.pixabay.com/photo/2018/10/01/09/21/pets-3715733_960_720.jpg'

response = requests.get(url)
pic = Image.open(BytesIO(response.content))

이미지 출력 1

  • 이미지 확인 (pillow)
    • Image 객체
pic

  • 타입(type) 확인
print(type(pic))
<class 'PIL.JpegImagePlugin.JpegImageFile'>
  • PIL 이미지를 array형으로 형변환
    • np.asarray()
pic_arr = np.asarray(pic)
print(type(pic_arr)) # 타입(type) 확인
print(pic_arr.shape) # HWC
print(pic_arr)
plt.imshow(pic_arr)
<matplotlib.image.AxesImage at 0x7fa57d35f2e0>

이미지 출력 2

  • R, G, B 에 따라 이미지 확인
pic_copy = pic_arr.copy()
print(pic_copy[:,:,0])
print(pic_copy[:,:,0].shape)
[[214 214 215 ... 235 234 233]
 [214 215 215 ... 235 233 233]
 [215 215 215 ... 235 233 233]
 ...
 [211 211 211 ... 229 229 229]
 [211 211 211 ... 229 229 230]
 [211 211 211 ... 231 231 232]]
(640, 960)
  • 채널 순서 (R G B : 0 1 2)
    • R channel
# cmap(컬러맵)은 1차원 데이터(단일 채널 이미지) 또는 2차원 배열에 색상을 매핑하기 위해 사용
plt.figure(figsize=(15,5))
plt.subplot(1,3,1)
plt.imshow(pic_copy[:,:,0], cmap='gray')
plt.subplot(1,3,2)
plt.imshow(pic_copy[:,:,1], cmap='gray')
plt.subplot(1,3,3)
plt.imshow(pic_copy[:,:,2], cmap='gray')
plt.show()

채널별 분포 확인

# R channel 분포 확인
pic_red = pic_arr.copy()
pic_red[:,:,1] = 0
pic_red[:,:,2] = 0

# G channel 분포 확인
pic_green = pic_arr.copy()
pic_green[:, :, 0] = 0
pic_green[:, :, 2] = 0

# B channel 분포 확인
pic_blue = pic_arr.copy()
pic_blue[:, :, 0] = 0
pic_blue[:, :, 1] = 0
plt.figure(figsize=(20,5))
plt.subplot(1,4,1)
plt.imshow(pic_arr)
plt.subplot(1,4,2)
plt.imshow(pic_red)
plt.subplot(1,4,3)
plt.imshow(pic_green)
plt.subplot(1,4,4)
plt.imshow(pic_blue)
plt.show()

이미지 출력 3

  • OpenCV

  • from google.colab.patches import cv2_imshow

    • 원래는 cv2.imshow
  • 아래 이미지는 어색하게 보이는데 이는 OpenCV와 matplotlib의 색공간 순서가 다르기 때문에 생기는 문제임
  • matploblib : R G B
  • OpenCV : B G R
from google.colab.patches import cv2_imshow
cv2_imshow(pic_arr)

OpenCV 의 채널 순서

  • OpenCV를 통해 영상(이미지)을 다룰 때의 채널 순서는 B G R

  • matplotlib은 R G B 순서

  • cv2.cvtColor(image arrary, 변경할 색공간) 함수를 이용하여 색공간을 변경해주면 정상적으로 시각화가 가능함

  • 변경할 색공간은 여러 가지가 있음

    • cv2.COLOR_BGR2RGB

    • cv2.COLOR_RGB2GRAY

    • cv2.COLOR_GRAY2RGB

    • ...

image = cv2.cvtColor(pic_arr, cv2.COLOR_RGB2BGR)
cv2_imshow(image)

  • image, pic_arr 비교

    • 0 1 2 인덱스 중 0, 2가 바뀐 것을 알 수 있음
print(image[0][0])
[140 123 214]
print(pic_arr[0][0])
[214 123 140]
  • (참고) array[ : , : , : : -1] 을 통해서도 인덱스 순서를 바꿀 수 있음
temp_arr = pic_arr[:,:, ::-1]
print(pic_arr[0][0])
[214 123 140]
print(temp_arr[0][0])
[140 123 214]
  • 전체 배열 확인
print(temp_arr)
print(pic_arr)

이미지 읽기 2

  • cv2.imread()

    • path, 이미지 파일의 flag값을 인자로 넣어줌

      • cv2.IMREAD_COLOR
        이미지 파일을 Color로 읽어들이고, 투명한 부분은 무시되며, Default 값

      • cv2.IMREAD_GRAYSCALE
        이미지를 Grayscale로 읽음. 실제 이미지 처리시 중간단계로 많이 사용

      • cv2.IMREAD_UNCHANGED
        이미지 파일을 alpha channel (투명도)까지 포함하여 읽어 들임

  • (주의)

    • cv2.imread()는 잘못된 경로로 읽어도 NoneType으로 들어갈 뿐, 오류를 발생하지 않음
  • 이미지 다운로드 후 colab에 업로드


from google.colab import files
files.upload()
image = cv2.imread('Lenna.png', cv2.IMREAD_UNCHANGED)
print(type(image))
<class 'numpy.ndarray'>
cv2_imshow(image)

plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(image)

plt.subplot(1,2,2)
image_temp = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image_temp)
plt.show()

  • grayscale로 읽기
img_gray = cv2.imread('Lenna.png',cv2.IMREAD_GRAYSCALE)
print(img_gray.shape)
(220, 220)
cv2_imshow(img_gray)

plt.figure(figsize=(20,5))
plt.subplot(1,4,1)
plt.imshow(img_gray)
plt.subplot(1,4,2)
plt.imshow(img_gray, cmap='gray')
plt.subplot(1,4,3)
plt.imshow(img_gray, cmap='magma')
plt.subplot(1,4,4)
plt.imshow(img_gray, cmap='coolwarm')
plt.show()

이미지 저장

  • cv2.imwrite()
    • 경로, 이미지 배열을 인자로 받음
random_image = np.random.randint(0,256, size=(200,200,3))
print(random_image.shape )
(200, 200, 3)
  • 이미지 저장을 하면 True반환
cv2.imwrite('./random_image.png', random_image)
True
  • 없는 이미지를 읽어도 type이 NoneType으로 들어갈 뿐 에러를 발생하지 않음
no_image = cv2.imread('no_image.png')
```![업로드중..](blob:https://velog.io/e83a72b1-5ec4-4d98-9d17-eadf54c1c5ca)



```python
type(no_image)
NoneType
my_image = cv2.imread('random_image.png')
print(type(my_image))
print(my_image.shape)
<class 'numpy.ndarray'>
(200, 200, 3)
cv2_imshow(my_image)

색 공간의 종류 (참고)

  • RGB

    • 컬러 표현을 빛의 3원색인 (Red, Green, Blue)으로 서로 다른 비율을 통해 색 표현
  • CMYK

    • Cyan, Magenta, Yellow, Black를 기본으로 하여 주로 컬러 프린터나 인쇄시에 사용

    • 각 성분들의 감산에 의해 컬러 구현

  • YUV

    • Y축은 밝기 성분을 U,V 두축을 이용하여 색상을 표현

    • U축은 파란색에서 밝기 성분을 뺀 값, V축은 빨간색에서 밝기 성분을 뺀 값

    • 아날로그 컬러신호 변환에 주로 사용. (U = B - Y) , (V = R - Y)

  • YCbCr

    • Digital TV에서 사용하는 색공간

    • YPbPr이라는 아날로그 신호의 색공간을 디지털화한 것

    • YPbPr은 아날로그 컴포넌트 비디오에서 사용

files.upload()
origin_image = cv2.imread('dog.jpg')
  • OpenCV와 matplotlib의 색공간 순서가 다르기 때문에 생기는 문제

    • matploblib : R G B

    • OpenCV : B G R

plt.imshow(origin_image)
plt.show()

img_rgb = cv2.cvtColor(origin_image, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
<matplotlib.image.AxesImage at 0x7fa56f3ddc60>

HSL Color Space

  • 색상(Hue), 채도(Saturation), 밝기(Lightness)로 색을 표현하는 방식

  • HSV와 동일하지만 밝기 요소의 차이

  • HSV와 더불어 사람이 실제로 color를 인지하는 방식과 유사


    [이미지 출처] https://rgbtohex.page/hsl

profile
인공지능을 공부하고 가르치는 김민수 강사입니다. 공부한 내용 및 수업 자료가 업로드 됩니다.

0개의 댓글