728x90
반응형
개요
데이터 과학자나 개발자에게 이미지는 단순히 보는 것을 넘어 분석하고 조작해야 할 다차원 데이터 구조입니다. 이번 글에서는 간단한 Python 라이브러리인 NumPy와 Matplotlib을 이용해 이미지를 데이터 관점에서 해부하고 기본적인 조작을 해보겠습니다.
1. 이미지 NumPy 배열로 바꾸기
우리는 Jupyter Notebook 환경에서 작업을 시작합니다. 이미지를 데이터로 다루기 위한 필수 라이브러리들을 볼러옵니다.
아래 간단한 코드를 통해 JPG 파일이 메모리에서 NumPy 배열(행렬)로 변환됩니다.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as Image
# 이미지를 불러와 NumPy 배열로 변환
img = Image.imread('imgs/dog_rgb.jpg')
# 이미지를 화면에 표시
plt.imshow(img)
plt.show()
2. 모든 색상은 3가지 숫자로 만들어진다(RGB)
디지털 이미지의 각 픽셀은 하나의 색상을 표현합니다. 이 색상은 세 가지 독립적인 색상 채널의 조합으로 결정됩니다. 프레임의 특징 X,Y 위치에 있는 모든 픽셀은 빨간색(RED), 녹색(GREEN), 파란색(BLUE) 이라는 세 가지 구성 요소의 강도(Intensity)를 가집니다.
- 다차원 구조 : 이미지는 높이 X 너비 X 3(RGB) 형태의 3차원 배열입니다.
- 색 깊이(Color Depth) : 각 생상 구성 요소는 8비트 정보를 가지며 0부터 255까지의 정수 값을 표현합니다.
- 총 정보량 = 8 X 3 =24 비트
- 총 표현 가능 색상 수 =2^24=16,777,216 가지
3. 배열 슬라이싱으로 이미지 자르기 & 뒤집기
NumPy 배열이 된 이미지는 파이썬 슬라이싱(Slicing) 문법을 사용해 쉽게 조작할 수 있습니다.
- 이미지 자르기(Crop)
- $\text{Y}$축(높이)의 100~400, $\text{X}$축(너비)의 200~600 영역만 잘라낼 수 있습니다.
# img[y_start:y_end, x_start:x_end, all_channels]
img_cropped = img[100:400, 200:600, :]
plt.imshow(img_cropped)
plt.show()
- 이미지 뒤집기(Flip)
- 슬라이싱의 스텝(Step)을 -1로 설정하면 배열의 순서가 역순이 되어 이미지를 뒤집을 수 있습니다.
# 좌우 반전: 너비(두 번째 인덱스)만 ::-1
img_flipped = img[:, ::-1, :]
plt.imshow(img_flipped)
plt.show()
4. 개별 색상 채널 분리하기
각 픽셀은 R, G, B 세 개의 숫자를 가지고 있으므로, 특정 채널의 기여도를 확인하려면 나머지 채널을 제거(0으로 설정)하거나 해당 채널의 강도 값만 추출하면 됩니다.
접근 1 : 색상 제거를 통한 분리(Color Isolation)
파란색(B) 채널만 보려면, 빨간색(인덱스 0)과 녹색(인덱스 1) 채널의 모든 픽셀 값을 0으로 만듭니다.
r_component=img.copy(); r_component[:,:,[1,2]]=0
g_component=img.copy(); g_component[:,:,[0,2]]=0
b_component=img.copy(); b_component[:,:,[0,1]]=0
# ... (matplotlib을 이용해 세 이미지를 나란히 표시)
접근 2 : 강도 값만 추출하여 흑백으로 시각화
각 채널의 강도 값만 추출하여 2차원 배열로 만든 다음, cmap='gray' 옵션으로 흑백 명암으로 시각화할 수 있습니다.
imgRed = img[::,::,0] # R 채널의 2차원 강도 배열
# ... (imgGreen, imgBlue도 추출)
# ...
ax[i].imshow(imgRed, cmap='gray') # 흑백 맵으로 강도 시각화
반응형