MATLABによるフォトメトリックステレオ法を用いた3次元形状復元の実装

フォトメトリックステレオ法(Photometric Stereo)は、異なる光源方向から撮影された複数の2次元画像を利用して、対象物の表面法線と反射率(アルベド)を推定し、最終的に3次元形状を復元する手法です。本稿では、MATLABを用いた基本的なアルゴリズムの実装と、精度向上のための最適化手法について解説します。

1. アルゴリズムの基礎理論

最も基本的なモデルであるランベルト(Lambertian)反射を仮定すると、ある画素の輝度 $I$ は以下の式で表されます。

I = ρ * (L · N)

  • ρ (Albedo): 表面の反射率
  • L (Light Vector): 光源方向の単位ベクトル
  • N (Normal Vector): 表面の法線単位ベクトル

未知数である法線 $N$ と反射率 $\rho$ を求めるには、少なくとも3つの異なる光源方向からの画像が必要になります。観測された輝度値をベクトル $I$、光源行列を $L$ とすると、最小二乗法を用いて未知のベクトル $G = \rho N$ を解くことができます。

2. MATLABによるコアアルゴリズムの実装

以下に、効率的な行列演算を用いた法線推定のMATLAB関数例を示します。ループ処理を避け、ベクトル化することで高速な計算が可能です。

function [surface_normals, albedo_map] = compute_photometric_stereo(img_stack, light_matrix)
    % img_stack: [H x W x N] の画像データ(N枚の画像)
    % light_matrix: [N x 3] の光源方向行列
    
    [img_h, img_w, num_imgs] = size(img_stack);
    
    % 画像データを2次元行列に変換 [N x Pixels]
    observed_I = reshape(img_stack, img_h * img_w, num_imgs)';
    
    % 最小二乗法による解法: L * G = I => G = L \ I
    % G は [3 x Pixels] の行列
    G_matrix = light_matrix \ observed_I;
    
    % アルベド(反射率)の計算: 各列ベクトルのノルム
    albedo_vec = sqrt(sum(G_matrix.^2, 1));
    
    % 法線ベクトルの正規化
    % ゼロ除算を防ぐために微小値を加算
    normals_vec = G_matrix ./ (albedo_vec + eps);
    
    % 元の画像サイズにリシェイプ
    albedo_map = reshape(albedo_vec, img_h, img_w);
    surface_normals = reshape(normals_vec', img_h, img_w, 3);
end

3. 3次元再構成の実装フロー

推定された法線マップから3次元の深度情報を生成するには、法線の勾配を積分する必要があります。

  1. データの前処理: 輝度値の正規化、ノイズ除去(ガウシアンフィルタ等)、および背景を計算から除外するためのマスク作成を行います。
  2. 法線推定: 上述の最小二乗法を用いて、各画素の法線ベクトル $(n_x, n_y, n_z)$ を算出します。
  3. 法線から深度への変換: 勾配 $(p, q) = (-n_x/n_z, -n_y/n_z)$ を計算し、Frankot-Chellappa法などの積分アルゴリズムを用いて深度マップを生成します。
  4. 点群の生成と可視化: 深度情報をカメラパラメータに基づいて3次元座標に変換し、pcshow 関数等で可視化します。

4. 高精度化に向けた最適化

実環境下では、影(シャドウ)や鏡面反射(ハイライト)がランベルト則に反するため、推定誤差の原因となります。これに対処するための高度なアプローチを以下に挙げます。

頑健な推定法(Robust Estimation)

最小二乗法の代わりに、反復重み付き最小二乗法(IRLS)やメディアンフィルタを導入することで、影やハイライトの影響を外れ値として抑制できます。

非ランベルトモデルの適用

光沢のある表面に対しては、Oren-NayarモデルやWardモデルなどのより複雑な反射モデルを導入し、エネルギー関数を最小化する非線形最適化(MATLABの fminunc などを使用)を行います。

% 非線形最適化によるアプローチの概念
options = optimoptions('fminunc', 'Algorithm', 'quasi-newton');
estimated_params = fminunc(@(x) energy_function(x, images, lights), initial_guess, options);

5. 応用分野と現在の課題

フォトメトリックステレオは、微細な表面テクスチャのキャプチャに優れており、以下の分野で活用されています。

  • 工業検査: 金属部品の微細な傷や凹凸の検出。
  • デジタルアーカイブ: 考古遺物や絵画の非接触3次元スキャン。
  • 生体認証: 指紋や顔の細かな立体構造の解析。

現在の主な課題は、複雑な相互反射が発生する凹形状の再構成や、リアルタイム処理のためのGPU加速実装、深層学習を用いた光源推定の自動化などが挙げられます。

タグ: MATLAB ComputerVision PhotometricStereo ImageProcessing 3DReconstruction

11月5日 05:58 投稿