2d to 2 5d

단일 사진에서 달 지형의 기복을 추출하는 방법 — 실험적 2.5D 파이프라인

요약: 단일 궤도 사진에서 달 표면의 상대적 높이 지도를 추정하려는 연구 프로젝트를 설명합니다. 입체시(stereoscopy) 없이, 머신러닝 없이 — 오직 고전적인 그림자 분석, 밝기 기울기, 그리고 지리참조 데이터만을 사용합니다.


문제: 2D에서 3D 복원하기

달 표면의 모든 사진은 3D를 2D로 투영한 것입니다. 고도 정보가 “평탄화”됩니다. 이를 복원하기 위해 몇 가지 단서를 활용할 수 있습니다:

  • 그림자 — 그림자가 길수록 물체가 높습니다 (조명 매개변수가 알려진 경우)
  • 밝기 기울기 — 급격한 밝기 변화는 경사면을 나타냅니다
  • 알베도 — 표면 물질도 밝기를 변화시키며, 이는 위 두 가지 분석을 복잡하게 만듭니다

문제는 알베도와 지형이 서로 얽혀(entangled) 있다는 것입니다. 사진에서 밝은 점은 밝은 레골리스로 된 평지일 수도 있고, 태양 쪽으로 기울어진 경사면일 수도 있습니다. 단일 촬영에서 이 둘을 완전히 분리하는 것은 불가능합니다 — 이것은 근본적인 물리적 한계입니다. 이 프로젝트는 이를 공개적으로 인정하고, 그 제약 조건을 중심으로 전체 신뢰도 시스템을 구축합니다.


file screenshot

파이프라인 아키텍처

코드는 7단계로 나뉘며, 각 단계는 자체 진단 이미지를 생성합니다:

1단계 — 그림자 감지

그림자 마스크는 백분위수 방법(기본값: 가장 어두운 15%의 픽셀) 또는 표준편차 방법으로 생성됩니다. 이것은 휴리스틱 접근법입니다 — 어두운 물질이 그림자로 잘못 분류될 수 있습니다.

01_shadow_mask.png

2단계 — 그림자로부터의 높이 산출

그림자 마스크에서 그림자 길이를 측정하고 상대적 높이로 변환합니다:

height = shadow_length_px × pixel_scale_m × tan(sun_elevation°)

그림자를 드리우는 물체가 수직이라는 가정을 사용합니다. 이는 근사값이지만 암석과 크레이터 가장자리에는 충분합니다.

02_shadow_length_map.png
03_shadow_height_map.png

3단계 — 알베도 맵

알고리즘은 inspect box라 불리는 작은 창에서 “예상” 배경 밝기를 보간합니다. 이 창들은 알려진 지리적 지점에서 물질의 밝기를 샘플링합니다. 버전 2.6에서는 이 창의 위치가 무작위가 아닌 QuickMap 데이터의 실제 달 좌표(위도/경도)에서 파생됩니다.

04_albedo_reference_map.png

4단계 — 밝기 정규화

관측된 밝기를 예상 알베도 밝기로 나누어 지형의 영향을 분리합니다:

normalized = observed / expected_albedo
05_normalized_brightness.png

5단계 — 기울기

정규화된 밝기에 대해 공간 기울기(크기 및 방향)를 계산합니다. 강한 기울기는 경사면을 나타내며, 기울기 방향은 사면의 방위를 보여줍니다.

06_gradient_magnitude.png
07_gradient_direction.png  ← HSV 시각화: 색상 = 방향

6단계 — 신뢰도 맵(Confidence Map)

이것이 프로젝트의 핵심입니다. 신뢰도 맵은 5개의 독립적인 구성 요소를 결합합니다:

구성 요소측정 대상
Shadow distance그림자 가장자리까지의 근접도
Gradient밝기 기울기의 강도
Texture variance국소 분산(텍스처)
Albedo stabilityinspect box까지의 근접도
Failure penalty본질적으로 분석에 부적합한 영역에 대한 벌점

최종 신뢰도 맵 = 구성 요소의 가중 합 × 실패 영역 벌점.

08_confidence_map.png  ← 녹색 = 높은 신뢰도, 빨간색 = 낮은 신뢰도

7단계 — 최종 높이 맵

그림자에서 얻은 높이와 기울기 기반 경사면을 결합합니다. 신뢰도가 낮은 영역에서는 결과를 중앙값 방향으로 평활화합니다 — 노이즈를 지형으로 표시하는 것을 방지하기 위해서입니다.

09_height_map.png
10_height_map_confidence_overlay.png  ← 높이 + 신뢰도를 불투명도로 표시

입력 데이터: QuickMap

이 프로젝트는 QuickMap (LROC, 애리조나 주립대학교)의 데이터를 사용합니다:

  • LROC NAC 이미지 — 고해상도 궤도 사진 (최대 해상도에서 ~1 m/픽셀)
  • Region Data CSV — QuickMap의 측정 지점으로, 지리 좌표(위도/경도), 지형 높이(TerrainHeight), 경사(Slope), 광학적 조성 등을 포함

.vrt 파일(GDAL Virtual Dataset)은 지리참조 메타데이터를 제공합니다: 좌표계, 지리적 변환, 픽셀 스케일.


프로젝트 반복(Iteration)

코드는 세 번의 반복을 거쳤으며, 각각 새로운 계층을 추가했습니다:

반복 2 — 기본 파이프라인 (그림자 + 기울기 + 신뢰도 맵)

반복 2.5 — 진단 계층: 신뢰도 맵의 5개 구성 요소 분해, 기울기 히스토그램, 이상값 오버레이, 그림자-기울기 상호작용. 목표: *”내가 올바른 이유로 파이프라인을 신뢰하고 있는가?”*

반복 2.6 — 실제 좌표: inspect box를 무작위가 아닌 QuickMap 데이터를 사용하여 배치. 위도/경도 → 픽셀 매핑은 선형 근사를 통해 수행 (지도 투영 보정 없음).

반복 3 (validate_iteration3.py) — 추세 검증: 기울기 방향을 외부 DEM(LOLA/LROC)과 비교. 최적화 없음 — 오직 다음 질문에만 답합니다: *”재구성된 추세가 실제 지형과 일치하는가?”*


이 프로젝트가 하지 않는 것

이 목록은 기능 목록만큼이나 중요합니다:

  • DEM을 생성하지 않습니다 — 높이는 상대적이며, 절대 기준이 없습니다
  • 머신러닝을 사용하지 않습니다 — 모든 단계가 사람이 해석 가능합니다
  • 사진측량이 아닙니다 — 스테레오 쌍 없음, 삼각측량 없음
  • 평지에서는 잘 작동하지 않습니다 — 균일한 영역은 지형 신호를 생성하지 않습니다
  • 알베도와 지형을 완전히 분리하지 못합니다 — 단일 이미지에서는 불가능합니다

결과 및 검증

달의 예시 지역(7.63°N, 6.53°E)에서, LROC NAC 최대 해상도(1 m/px)로, 합성 DEM을 사용하여(테스트 중 LOLA 접근 불가) 테스트한 결과, 반복 3의 검증은 다음과 같이 분류합니다:

  • 높은 신뢰도 영역의 약 **3.6%**가 DEM 추세와 일치
  • 약 **17.7%**가 불일치
  • 나머지: 결론을 도출하기에는 신뢰도가 너무 낮음

결과는 정직하게 보고됩니다 — 프로젝트는 이 수치를 해명하거나 “수정”하려 하지 않습니다. 불일치는 정보이지, 숨겨야 할 오류가 아닙니다.


잠재력과 응용

이 프로젝트가 활용하는 데이터의 더 넓은 맥락을 언급할 가치가 있습니다.

LROC NAC가 촬영한 달 표면 이미지는 지구 외 천체 표면의 가장 상세한 매핑입니다. ~1 m/픽셀의 해상도에서 각 픽셀은 1제곱미터의 표면에 해당하며 — 이는 태양계의 다른 어떤 행성이나 위성에서도 달성할 수 없는 상세도입니다. 달 대기의 부재는 흐림과 광학적 왜곡을 제거하여 이미지 품질을 더욱 향상시킵니다.

QuickMap은 또한 LOLA(LRO Laser Altimeter) 데이터로 재구성된 3D 뷰를 제공합니다. 이는 지형 형태에 대한 확장된 이해를 제공하지만, 이 파이프라인과 마찬가지로 제한된 범위 내에서 지형을 표현합니다 — 완전하고 정밀한 사진측량은 아닙니다.

추가로 추출할 수 있는 것

이 프로젝트의 주요 제한 전제는 단일 각도에서의 단일 이미지입니다. 동일 지역의 두 장 이상의 이미지가 유사한 해상도와 다른 조명 각도로 제공된다면, 분석 가능성은 크게 확장됩니다:

주행 가능성 평가 — 최소 경사와 적은 수의 암석이 있는 지형 식별, 로버 경로 계획에 유용합니다.

레골리스 두께 추정 — 암석의 그림자와 주변 환경과의 관계는 느슨한 표면층의 깊이를 나타낼 수 있습니다.

암석 형성 분석 — 다양한 조명 각도에서의 암석 분포와 형태는 예비적인 암석학적 분류를 가능하게 합니다.

이 모든 것은 아직 연구 영역이며, 완성된 도구가 아닙니다. 그러나 출발점은 매우 좋습니다: 데이터는 공개적이고, 무료이며, 가능한 최고 품질입니다.


코드 및 라이선스

Python 코드(~1,600줄, 외부 AI 프레임워크 없음)는 다음만을 사용합니다: numpy, opencv-python, scipy, matplotlib

소스 코드는 GitHub에서 공개적으로 이용할 수 있습니다: github.com/MarcinSFox/Lunar_2.5D

모든 단계는 명시적이고 문서화되어 있습니다. 각 단계는 자체 진단 이미지를 생성하여, 파이프라인이 어디에서 잘 작동하고 어디에서 실패하는지 이해할 수 있게 합니다.

테스트 데이터: 달의 예시 지역(~7.63°N, 6.53°E), QuickMap의 LROC NAC 이미지, 스케일 ~1 m/px.


이 프로젝트를 연구 실험이자 학습 도구로 취급합니다. 결과는 지형 형태에 대한 가설이지 측정값이 아닙니다. 프로젝트의 가치는 방법의 투명성과 불확실성의 명시적 모델링에 있으며 — 결과의 정확성에 있지 않습니다.

Similar Posts