2d to 2 5d

如何從單張照片提取月球地形起伏——實驗性 2.5D 管線

摘要:我描述了一個研究專案,嘗試從單張軌道照片估算月球表面的相對高度圖。不使用立體視覺、不使用機器學習——僅依靠經典的陰影分析、亮度梯度和地理參照資料。


問題:從 2D 還原 3D

月球表面的每張照片都是將 3D 投影到 2D 的結果。高度資訊被「壓平」了。為了恢復它,我們手中有幾條線索:

  • 陰影 ——陰影越長,物體越高(在已知照明參數的條件下)
  • 亮度梯度 ——亮度的驟變指示坡面的存在
  • 反照率(albedo) ——表面材質也會改變亮度,這使上述兩項分析更加複雜

問題在於反照率與地形是糾纏(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 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 資料定位,不再隨機放置。緯度/經度 → 像素映射採用線性近似(無地圖投影校正)。

迭代 3validate_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 框架)僅使用: numpyopencv-pythonscipymatplotlib

原始碼已在 GitHub 上公開提供:github.com/MarcinSFox/Lunar_2.5D

所有步驟均為顯式且有文件記錄。每個階段產生各自的診斷影像,使人能夠了解管線在何處運作良好、在何處失敗。

**測試資料:**月球範例區域(約 7.63°N、6.53°E),QuickMap 的 LROC NAC 影像,比例尺約 1 公尺/像素。


我將此專案視為研究實驗與學習工具。結果是關於地形形態的假說,而非測量值。專案的價值在於方法的透明度與對不確定性的顯式建模——而非結果的精確度。

Similar Posts