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

  • 우리가 아는 달 — 그리고 우리가 모르는 달

    아르테미스 2가 다가오고 있다 (계획대로라면) 곧 — 이번에는 일정이 유지된다면 — 네 명의 우주비행사가 달 주위를 비행할 것이다. 착륙은 하지 않는다. 그저 달을 돌고 돌아올 뿐이다. 1972년 이후 처음으로 달을 향한 유인 미션이다. 반세기가 넘는 공백이다. 아르테미스 2의 발사 일정은 여러 차례 연기되었다. 가장 최근의 목표는 2026년 2월이었지만, 예행연습 중 수소 누출과 로켓 상단부의 헬륨…

  • 레골리스 차폐: 방 안의 500톤짜리 코끼리

    이론적으로 모든 진지한 달 거주지 설계는 보호를 위한 레골리스 층을 가정한다. 렌더링과 프레젠테이션에서는 사라진다. 물리학과 비전 사이의 이 간극은 우리가 실제로 어디에 있는지에 대해 중요한 것을 드러낸다. 지난 이야기 이전 글에서 나는 질문으로 끝맺었다: 레골리스—달 표면을 덮고 있는 회색 먼지—로 실제로 무엇을 할 수 있을까? 표준적인 답변은 간단하게 들린다. 차폐재로 사용하라. 거주지 위에 쌓아라. 방사선,…

  • 우리가 사는 시대를 무엇이라 부를까?

    AI 시대, LLM 시대, 그리고 우리 자신의 시대를 명명하는 문제 언어 모델과 대화하면서 간단한 말을 하려 한다고 상상해 보자. 모든 것이 시작된 때부터라는 의미를 전달하고 싶은 것이다. 비인간적인 존재와의 대화가 갑자기 가능해진 시간 — 이전까지는 오직 다른 인간에게만 허락되었던 방식으로. 그런데 막상 그것을 표현할 단 하나의 단어가 없다는 사실을 깨닫게 된다. 그래서 이렇게 말한다. “대규모…

  • 짧은 기술 메모

    받은 피드백을 바탕으로 AI907 운영 방식에 일부 조정을 진행하고 있습니다.기술적인 콘텐츠는 그대로 유지됩니다 — 의도적으로 니치한 주제이며, 처음 계획한 그대로입니다. 발행 주기를 늘릴 계획입니다: 주 1회, 매주 한 편의 글을 게시할 예정입니다.LLM 모델을 포함한 AI 기술은 매우 역동적으로 발전하고 있으며,AI907은 제가 장기적으로 구축해 나가고 있는 프로젝트입니다 — 이 분야가 진심으로 저를 매료시키기 때문입니다.

  • Claude와 함께 혁신적인 달 착륙장을 설계할 수 있을까?

    짧은 답: 그렇다. 긴 답은 — 아래에. 서론 달에는 착륙하는 우주선의 속도를 늦춰줄 대기가 없다. 우주선을 받아줄 공항도 없다. 달 표면에 착륙하는 모든 1킬로그램은 오로지 엔진만으로 제동해야 한다 — 그 자체로 거기까지 운반되어야 했던 연료를 태우면서. 이것은 닫힌 순환이다. 비싸고, 일회용이며, 에너지 집약적이다. 그럼에도 달은 우리가 착륙의 맥락에서 좀처럼 떠올리지 않는 무언가를 가지고 있다: 크레이터다….

  • 인간 생활의 관습적 공간

    우리는 실제로 어디에서 살 수 있을까? 지구는 우리의 행성이다. 우리가 이곳에서 살 수 있다는 사실은 자명해 보인다 — 결국 우리는 수십만 년 동안 그렇게 해왔다. 하지만 질문을 조금 더 정확하게 던져보자면, 복잡한 생명 유지 시스템 없이 인간이 거주하고 일할 수 있는 실제 공간은 얼마나 되는가라는 물음에 대한 답은 훨씬 덜 명확해진다. 여기서 말하는 것은 인간이…