フォトメトリックステレオ法(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次元の深度情報を生成するには、法線の勾配を積分する必要があります。
- データの前処理: 輝度値の正規化、ノイズ除去(ガウシアンフィルタ等)、および背景を計算から除外するためのマスク作成を行います。
- 法線推定: 上述の最小二乗法を用いて、各画素の法線ベクトル $(n_x, n_y, n_z)$ を算出します。
- 法線から深度への変換: 勾配 $(p, q) = (-n_x/n_z, -n_y/n_z)$ を計算し、Frankot-Chellappa法などの積分アルゴリズムを用いて深度マップを生成します。
- 点群の生成と可視化: 深度情報をカメラパラメータに基づいて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加速実装、深層学習を用いた光源推定の自動化などが挙げられます。