분류 전

이미지 픽셀값으로 3D plot 그리기

ryanhearts 2023. 6. 22.

회사에서 이미지 내 픽셀의 변화를 시각화하여 관찰할 일이 있어 기록 및 공유 겸 쓰는 글.

공유 목적으로 급조해서 만든 간단한 샘플 코드를 보고 리뷰 진행.

 

대부분의 경우 2D 플롯으로 충분한 시각화가 가능하지만 종종 필요한 경우가 있을 때 참고!


샘플 코드

https://colab.research.google.com/drive/1CW4OowtCq6AVtSnOZ4QHy74MoqiUrs3G?usp=sharing 

 

example_3d_plot.ipynb

Colaboratory notebook

colab.research.google.com


리뷰

(기본적인 부분은 패스)

1. 샘플 이미지 다운로드

256*256 사이즈 이미지 2장 (컬러 1장, 흑백 1장), 흑백 이미지는 컬러 이미지의 DFT output.

- gdown 커맨드를 활용해 구글 드라이브에 접근해 코랩 인스턴스에 다운로드 (about gdown)

# gray image sample
!gdown https://drive.google.com/uc?id=1icaenRL0tFjuQFIY9CYkEHwU08F-HCoK

# color image sample
!gdown https://drive.google.com/uc?id=12ru2SWq_h7LAdptfhEeZKNPmzjeDlKzi

2. 흑백 사진 데이터 준비 (이미지 > 좌표)

- X, Y의 경우 단순 2차원 인덱스 생성

- Z는 이미지의 픽셀 값을 펼쳐서 생성

- X, Y, Z 값들이 각각 하나씩 모여 하나의 점 (Xn, Yn, Zn)을 구성

# 3-axis coords setting
img = gray_image

width, height = img.shape[1], img.shape[0]
num_pixels = width * height

# X: width, Y: height
X = [i // width for i in range(num_pixels)]
Y = [i % width for i in range(num_pixels)]

# Z: flatten pixel value from image
Z = img.flatten()

3. 플롯 그리기

- add_subplot의 projection 인자를 통해 3d plot 객체 생성

- 위에서 준비한 X, Y, Z 좌표를 통해 scatter 생성

- view_init으로 관찰 각도 조정 (elev: 상하, azim: 좌우)

# draw 3d plot

fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')

ax.scatter(X,Y,Z, c=Z, cmap='viridis', s=0.5, alpha=1)

ax.view_init(elev=20, azim=30)  # set angle for view

plt.show()

4. 컬러 이미지를 활용한 플롯

elev=90, azim=0
elev=30, azim=30

- 각 컬러 채널(R, G, B) 별로 3개의 플롯이 나옴

- 흑백에서 한 작업을 채널별로 3번 반복

- 핵심은 cv2.split(img): (256, 256, 3) 형태의 데이터를 (256, 256) 형태 3개로 분리

     샘플 코드에선 채널 순서를 RGB로 세팅했기 때문에 (cv2.COLOR_BGR2RGB) R, G, B 순서대로 나옴

# Z : [Red, Green, Blue]
Z = [each_color.flatten() for each_color in cv2.split(img)]

 

'분류 전' 카테고리의 다른 글

Point Cloud란?  (0) 2023.09.14
IFA(국제 가전 박람회) 참가 후기  (0) 2023.09.11
코랩에서 구글 드라이브 파일에 접근하기  (0) 2023.06.16