如何從單張照片提取月球地形起伏——實驗性 2.5D 管線
摘要:我描述了一個研究專案,嘗試從單張軌道照片估算月球表面的相對高度圖。不使用立體視覺、不使用機器學習——僅依靠經典的陰影分析、亮度梯度和地理參照資料。
問題:從 2D 還原 3D
月球表面的每張照片都是將 3D 投影到 2D 的結果。高度資訊被「壓平」了。為了恢復它,我們手中有幾條線索:
- 陰影 ——陰影越長,物體越高(在已知照明參數的條件下)
- 亮度梯度 ——亮度的驟變指示坡面的存在
- 反照率(albedo) ——表面材質也會改變亮度,這使上述兩項分析更加複雜
問題在於反照率與地形是糾纏(entangled)在一起的。照片中的一個亮斑可能是由明亮風化層構成的平原,也可能是朝向太陽傾斜的坡面。從單張影像完全分離二者是不可能的——這是一項根本性的物理限制。本專案坦然承認這一點,並圍繞這項限制建構了整個信賴度系統。

管線架構
程式碼分為 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 boxes(在已知地理位置取樣材質亮度的小視窗)內插「預期」背景亮度。在 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 stability | 與 inspect boxes 的接近程度 |
| Failure penalty | 對本質上不適合分析之區域的懲罰 |
最終信賴度圖 = 各分量的加權和 × 失敗區域懲罰。
08_confidence_map.png ← 綠色 = 高信賴度,紅色 = 低信賴度
階段 7——最終高度圖
將陰影推算的高度與梯度推算的坡度合併。在低信賴度區域,結果朝中位數方向平滑化——以避免將雜訊呈現為地形。
09_height_map.png
10_height_map_confidence_overlay.png ← 高度 + 信賴度作為不透明度
輸入資料:QuickMap
本專案使用 QuickMap(LROC,亞利桑那州立大學)的資料:
- LROC NAC 影像 ——高解析度軌道照片(完整解析度下約 1 公尺/像素)
- Region Data CSV ——QuickMap 的測量點,包含:地理座標(緯度/經度)、地形高度(TerrainHeight)、坡度(Slope)、光學成分等
.vrt 檔案(GDAL Virtual Dataset)提供地理參照中繼資料:座標系統、地理變換和像素比例尺。
專案迭代
程式碼經歷了三次迭代,每次增加一個新的層次:
迭代 2 ——基本管線(陰影 + 梯度 + 信賴度圖)
迭代 2.5 ——診斷層:信賴度圖分解為 5 個分量、梯度直方圖、離群值疊加、陰影–梯度交互作用。目標:「我是否因為正確的理由而信任這條管線?」
迭代 2.6 ——真實座標:inspect boxes 改用 QuickMap 資料定位,不再隨機放置。緯度/經度 → 像素映射採用線性近似(無地圖投影校正)。
迭代 3(validate_iteration3.py)——趨勢驗證:將梯度方向與外部 DEM(LOLA/LROC)比較。不做最佳化——僅回答這個問題:「重建的趨勢是否與真實地形一致?」
本專案不做的事
這份清單與功能清單同等重要:
- 不生成 DEM ——高度為相對值,無絕對參照
- 不使用機器學習 ——每個步驟皆可由人類解讀
- 不是攝影測量 ——無立體像對、無三角測量
- 在平原上效果不佳 ——均勻區域不產生地形訊號
- 無法完全分離反照率與地形 ——從單張影像來說這是不可能的
結果與驗證
在一個月球範例區域(約 7.63°N、6.53°E)上測試,使用完整 LROC NAC 解析度(約 1 公尺/像素),採用合成 DEM(測試期間無法取得 LOLA 資料),迭代 3 的驗證將結果分類為:
- 高信賴度區域中約 3.6% 與 DEM 趨勢一致
- 約 17.7% 不一致
- 其餘:信賴度過低,無法得出結論
結果被誠實地報告——專案不試圖解釋或「修復」這些數字。不一致本身就是資訊,而非需要隱藏的錯誤。
潛力與應用
值得提及本專案所使用資料的更廣泛背景。
LROC NAC 拍攝的月球表面影像是地球以外天體表面最詳盡的測繪成果。在約 1 公尺/像素的解析度下,每個像素對應一平方公尺的表面——這是太陽系中任何其他行星或衛星都無法企及的精細程度。月球缺乏大氣層消除了模糊與光學畸變,進一步提升了影像品質。
QuickMap 還提供由 LOLA(LRO 雷射測高儀)資料重建的 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 公尺/像素。
我將此專案視為研究實驗與學習工具。結果是關於地形形態的假說,而非測量值。專案的價值在於方法的透明度與對不確定性的顯式建模——而非結果的精確度。
