본문 바로가기

Computer Vision + Python/비전 프로그래밍 기초 (초급자)

파이썬으로 3D 수중 지형 시각화 구현하기 (시뮬레이션 데이터 활용)

바다 환경이나 수중 지형을 3차원으로 표현하는 작업은 해양 데이터 분석이나 시각화 학습에서 매우 흥미로운 주제다. 이 글에서는 실제 수심 데이터가 아닌 **시뮬레이션(가상 데이터)**을 활용하여, 파이썬으로 3D 수중 지형을 표현하는 과정을 단계별로 정리한다.
본 예시는 실측 수심 정보가 아닌 임의로 생성한 데이터이며, 목적은 3D 시각화 구조와 표현 방법을 이해하는 것에 있다.
3D 수중 지형 시각화 개념 이해
수중 지형은 일반적으로 다음과 같은 요소로 구성된다.
완만한 경사
급격한 낙차 구간
돌출 지형(여 형태)
움푹 파인 구간(골 형태)
이러한 형태는 수학적 함수와 난수를 조합하면 충분히 표현할 수 있다. 실제 데이터를 사용하지 않더라도, 구조를 이해하는 데는 시뮬레이션이 효과적이다.

실행 환경
Python 3.x
numpy
matplotlib
(선택) scipy
Google Colab 환경에서도 동일하게 실행 가능하다.

파이썬 코드: 3D 수중 지형 생성

import numpy as np
import matplotlib.pyplot as plt

try:
    from scipy.ndimage import gaussian_filter
    USE_SMOOTH = True
except Exception:
    USE_SMOOTH = False

# 좌표 생성
n = 120
x = np.linspace(0, 100, n)
y = np.linspace(0, 100, n)
X, Y = np.meshgrid(x, y)

# 지형 구성 요소 생성
ridge = 2.5 * np.sin(X / 10) + 2.0 * np.cos(Y / 12)
pit   = -18.0 * np.exp(-((X-55)**2 + (Y-60)**2) / 500)
bump1 = 10.0 * np.exp(-((X-25)**2 + (Y-35)**2) / 350)
bump2 =  7.0 * np.exp(-((X-75)**2 + (Y-25)**2) / 450)

noise = 0.8 * np.random.randn(*X.shape)

Z = ridge + pit + bump1 + bump2 + noise

# 깊이 범위 정규화
Z = (Z - Z.min()) / (Z.max() - Z.min())
Z = Z * 30 - 25

# 부드럽게 처리 (선택)
if USE_SMOOTH:
    Z = gaussian_filter(Z, sigma=1.2)

# 3D 시각화
fig = plt.figure(figsize=(11, 7), dpi=140)
ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(
    X, Y, Z,
    cmap="ocean",
    linewidth=0,
    antialiased=True,
    alpha=0.95
)

zmin = Z.min() - 2

ax.contour(
    X, Y, Z,
    zdir='z',
    offset=zmin,
    cmap="winter",
    linewidths=1.0
)

ax.set_title("3D Underwater Terrain Visualization (Simulated)", pad=16)
ax.set_xlabel("Longitude Offset (m)")
ax.set_ylabel("Latitude Offset (m)")
ax.set_zlabel("Depth (m)")

ax.view_init(elev=28, azim=130)
ax.set_zlim(zmin, Z.max() + 2)

cbar = fig.colorbar(surf, shrink=0.72, pad=0.12)
cbar.set_label("Depth Level")

plt.tight_layout()
plt.savefig("underwater_terrain_simulated.png", bbox_inches="tight")
plt.show()

위 코드 실행 후 생성된 이미지 파일을 업로드한다.

3D Underwater Terrain Visualization (Simulated Data)


코드 구성 해설

이 코드의 핵심은 다음과 같다.

1. meshgrid를 이용해 2차원 좌표 생성
2. 사인/코사인 함수로 완만한 경사 표현
3. exp 함수로 돌출 및 함몰 지형 생성
4. 난수로 자연스러운 변형 추가
5. 정규화 후 깊이 범위 조정
6. plot_surface와 contour를 함께 사용하여 입체감 강화

이 구조는 실제 수심 데이터가 확보될 경우, Z값 부분만 교체하면 그대로 확장할 수 있다.

정리
시뮬레이션 데이터를 활용하면, 실제 측정 데이터 없이도 3D 수중 지형 시각화 구조를 충분히 구현할 수 있다. 중요한 것은 완벽한 데이터가 아니라, 시각화 구조와 표현 방식을 이해하는 것이다.
이와 같은 방식은 해양 데이터 분석, 환경 시각화, 지형 모델링 학습 등 다양한 분야로 확장할 수 있다.