회사에서 이미지 내 픽셀의 변화를 시각화하여 관찰할 일이 있어 기록 및 공유 겸 쓰는 글.
공유 목적으로 급조해서 만든 간단한 샘플 코드를 보고 리뷰 진행.
대부분의 경우 2D 플롯으로 충분한 시각화가 가능하지만 종종 필요한 경우가 있을 때 참고!
샘플 코드
https://colab.research.google.com/drive/1CW4OowtCq6AVtSnOZ4QHy74MoqiUrs3G?usp=sharing
example_3d_plot.ipynb
Colaboratory notebook
colab.research.google.com
리뷰
(기본적인 부분은 패스)
1. 샘플 이미지 다운로드
- 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. 컬러 이미지를 활용한 플롯
- 각 컬러 채널(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 |