# 본 자료는 이수안 교수님(https://suanlab.com/)의 자료를 기반으로 수정 및 보완하여 제작되었습니다.
# 제작자 : 김민수(rlaalstn1504@naver.com)
컴퓨터 이미지는 컴퓨터 비전의 핵심 기초 개념으로, 이미지 데이터를 어떻게 표현하고 처리하는지 이해하는 것이 중요합니다.
컴퓨터에서 이미지는 기본적으로 RGB 값으로 표현됩니다. RGB는 빨강(R), 녹색(G), 파랑(B) 세 가지 색의 조합으로 구성되며, 각 색의 강도는 0부터 255 사이의 정수 값으로 표현됩니다.
예시:
(0, 0, 0)
: 검정색
(255, 255, 255)
: 흰색
(255, 0, 0)
: 빨간색
(0, 255, 0)
: 녹색
(0, 0, 255)
: 파란색
(255, 0, 255)
: 핑크색
이러한 값들이 조합되어 이미지를 구성하며, 이미지의 크기에 따라 데이터의 양이 결정됩니다. 예를 들어, 1000 x 1000 크기의 이미지는 픽셀당 RGB(3개의 값)를 저장하므로 1000 x 1000 x 3 = 3,000,000개의 값이 필요합니다.
color: 3차원 (true color 라고도 불림)
[이미지 출처] https://en.wikipedia.org/wiki/RGB_color_space
https://commons.wikimedia.org/wiki/File:RGB_color_space_animated_view.gif
gray scale: 2차원
[이미지 출처] https://medium.com/@himnickson/converting-rgb-image-to-the-grayscale-image-in-java-9e1edc5bd6e7
[이미지 출처] https://ai.stanford.edu/~syyeung/cvweb/tutorial1.html
이미지 데이터는 효율적인 저장과 전송을 위해 압축되어 사용됩니다. JPEG, PNG, GIF와 같은 파일 포맷이 대표적입니다.
주요 포맷:
애니메이션을 지원하며, 256가지 색상으로 제한되는 간단한 압축 방식입니다.
이러한 압축 방식은 원래의 RGB 데이터를 효율적으로 압축하지만, 손실 압축 방식(JPEG 등)은 원본 데이터와 일부 차이가 발생할 수 있습니다. 압축된 데이터는 화면에 출력되기 전에 해당 포맷의 압축 해제 방식을 통해 RGB 값으로 복구됩니다. 하지만 손실된 데이터는 복구되지 않습니다.
컴퓨터 비전에서는 이미지 데이터를 입력으로 받아 다양한 작업을 수행합니다. 이를 위해, 이미지의 RGB 값이 컴퓨터가 이해할 수 있는 형태로 변환됩니다.
이미지 데이터를 처리하는 과정:
이미지 분류(Classification), 객체 탐지(Object Detection), 이미지 분할(Segmentation) 등 다양한 컴퓨터 비전 작업 수행.
딥러닝 모델(특히 CNN)은 입력 이미지를 픽셀의 RGB 값으로 받아서 공간적 정보(Spatial Information)를 학습합니다. 예를 들어, 이미지 분류 모델은 각 픽셀의 RGB 조합과 이들 간의 관계를 학습하여 이미지를 특정 클래스(예: 고양이, 강아지 등)로 분류합니다.
컴퓨터 이미지는 기본적으로 RGB 데이터의 조합으로 구성되며, 다양한 포맷으로 저장 및 전송됩니다. 컴퓨터 비전에서는 이러한 데이터를 처리하여 이미지의 패턴과 의미를 추출하고, 이를 기반으로 분류, 탐지, 생성 등 복잡한 작업을 수행합니다.
기존의 필터나 머신러닝 기반 접근법은 컴퓨터 비전 작업에서 효율적인 방법을 제공했지만, 딥러닝 기반 접근법은 데이터를 기반으로 직접 특징을 학습할 수 있어 더 복잡하고 정교한 작업을 수행할 수 있습니다.
따라서 컴퓨터 이미지의 기초 개념과 함께 전통적인 특징 추출 기법과 딥러닝 방법을 모두 이해하는 것이 컴퓨터 비전의 성공적인 활용에 필수적입니다.
소개:
이미지 처리: 필터링, 히스토그램 계산, 에지 검출, 기하학적 변환 등
비디오 분석: 객체 추적, 모션 추정
머신러닝: 사전 정의된 알고리즘(SVM, KNN 등) 제공
딥러닝 지원: 사전 학습된 모델과 ONNX 포맷을 활용한 딥러닝 작업 가능
[이미지 출처] https://ko.wikipedia.org/wiki/OpenCV
소개:
이미지 읽기 및 저장: 다양한 포맷의 이미지를 읽고 저장할 수 있습니다.
파일 형식 변환(예: PNG → JPEG 등)이 가능합니다.
이미지 변환: 크기 조정(Resizing), 회전(Rotation), 색상 변경(Grayscale 변환 등)과 같은 작업을 쉽게 수행할 수 있습니다.
이미지 필터링:블러(Blur), 샤프닝(Sharpening) 등 기본적인 필터링 기능 제공.
텍스트 추가: 이미지를 배경으로 텍스트를 추가하는 기능 지원.
[이미지 출처] https://www.linkedin.com/pulse/pil-library-functions-rahul-saxena
이미지는 컴퓨터에서 픽셀 값의 배열로 표현되며, 이러한 배열은 Python의 NumPy를 사용하여 쉽게 처리할 수 있습니다.
컬러 이미지: 3차원 배열(높이, 너비, 채널)로 표현됩니다. 각 픽셀은 [R, G, B] 값을 가지며, 일반적으로 0~255 범위의 정수로 표현됩니다.
흑백 이미지: 2차원 배열로 표현되며, 각 픽셀은 0~255의 밝기 값으로 나타냅니다.
NumPy는 이미지 데이터를 효율적으로 처리하기 위한 강력한 도구를 제공하며, OpenCV와 함께 사용하면 효과적입니다.
코드 참조 : https://opencv-python.readthedocs.io/en/latest/index.html
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))
pillow
)pic
print(type(pic))
<class 'PIL.JpegImagePlugin.JpegImageFile'>
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>
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 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()
OpenCV
from google.colab.patches import cv2_imshow
cv2.imshow
matploblib
: R G BOpenCV
: B G Rfrom google.colab.patches import cv2_imshow
cv2_imshow(pic_arr)
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 비교
print(image[0][0])
[140 123 214]
print(pic_arr[0][0])
[214 123 140]
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)
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)
cv2.imwrite('./random_image.png', random_image)
True
no_image = cv2.imread('no_image.png')
```
```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
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>
색상(Hue), 채도(Saturation), 밝기(Lightness)로 색을 표현하는 방식
HSV와 동일하지만 밝기 요소의 차이
HSV와 더불어 사람이 실제로 color를 인지하는 방식과 유사
[이미지 출처] https://rgbtohex.page/hsl