Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

disparity

(非推奨) ステレオ イメージ間の視差マップ

関数 disparity は推奨されません。代わりに disparityBM または disparitySGM を使用してください。詳細については、互換性の考慮事項を参照してください。

説明

disparityMap = disparity(I1,I2) は、ステレオ イメージのペア I1I2 の視差マップ disparityMap を返します。

disparityMap = disparity(I1,I2,Name,Value) は、Name,Value ペアの引数を 1 つ以上使用して視差アルゴリズムの追加のコントロールを提供します。

すべて折りたたむ

イメージを読み込んでグレースケールに変換します。

I1 = imread('scene_left.png');
I2 = imread('scene_right.png');

ステレオ アナグリフを表示します。赤とシアンの立体眼鏡を使用して、イメージを 3 次元表示します。

figure
imshow(stereoAnaglyph(I1,I2));
title('Red-cyan composite view of the stereo images');

Figure contains an axes object. The axes object with title Red-cyan composite view of the stereo images contains an object of type image.

視差マップを計算します。

disparityRange = [-6 10];
disparityMap = disparity(rgb2gray(I1),rgb2gray(I2),'BlockSize',...
    15,'DisparityRange',disparityRange);

視差マップを表示します。可視性を向上するには、視差範囲を imshow の表示範囲として使用します。

figure 
imshow(disparityMap,disparityRange);
title('Disparity Map');
colormap(gca,jet) 
colorbar

Figure contains an axes object. The axes object with title Disparity Map contains an object of type image.

入力引数

すべて折りたたむ

カメラ 1 に対応する、I1 として参照される入力イメージ。2 次元グレースケールで指定します。ステレオ イメージ I1I2 を平行化して、対応する点が同じ行に配置されるようにしなければなりません。この平行化は、関数 rectifyStereoImages を使用して行うこともできます。

I1I2 のクラスを uint8 に設定し、列数が 4 で割り切れるように設定することで、関数の速度を向上できます。入力イメージ I1I2 は、実数、有限、非スパースでなければなりません。これらは同じクラスでなければなりません。

データ型: uint8 | uint16 | int16 | single | double

カメラ 2 に対応する、I2 として参照される入力イメージ。2 次元グレースケールで指定します。入力イメージを平行化して、対応する点が同じ行に配置されるようにしなければなりません。I1I2 のクラスを uint8 に設定し、列数が 4 で割り切れるように設定することで、関数の速度を向上できます。入力イメージ I1I2 は、実数、有限、非スパースでなければなりません。これらは同じクラスでなければなりません。

データ型: uint8 | uint16 | int16 | single | double

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: 'Method','BlockMatching' は、'Method' プロパティが 'BlockMatching' に設定されるように指定します。

視差推定アルゴリズム。'Method' と、'BlockMatching' または 'SemiGlobal' で構成されるコンマ区切りのペアとして指定します。視差関数は、基本ブロック マッチング[1]アルゴリズムと、セミグローバル ブロック マッチング[3]アルゴリズムを実装しています。'BlockMatching' 法では、関数がイメージ内のピクセルの各ブロックについて差の絶対値の和 (SAD) を比較し、視差を計算します。'SemiGlobal' マッチング法ではさらに、近傍のブロックの視差が同じような値になるようにします。このような追加制約を適用することで、'BlockMatching' 法より詳細な視差の推定が可能になります。

アルゴリズムは次のステップを実行します。

  1. ソーベル フィルターを使用してイメージのコントラストの測定値を計算します。

  2. I1 内の各ピクセルについて視差を計算します。

  3. 計算結果の信頼性が低い、視差マップ disparityMap の要素をマークします。関数は -realmax('single') を使用してこれらの要素をマークします。

視差の範囲。'DisparityRange' と 2 要素ベクトルで構成されるコンマ区切りのペアとして指定します。2 要素ベクトルは [MinDisparity, MaxDisparity] の形式でなければなりません。両方の要素が整数でなければなりませんが、負の値でもかまいません。MinDisparity と MaxDisparity は、[-image width, image width] の範囲内でなければなりません。MaxDisparity と MinDisparity の差は、16 の倍数でなければなりません。DisparityRange は、実数、有限、非スパースでなければなりません。I1 の撮影に使用されたカメラが I2 の撮影に使用されたカメラの右側にあった場合、MinDisparity は負でなければなりません。

視差の範囲は、2 つのカメラ間の距離と、カメラと対象オブジェクト間の距離によって異なります。カメラとカメラの間隔が広い、またはオブジェクトとカメラが接近している場合には、DisparityRange の値を大きくします。構成に適切な視差を判定するには、イメージ ビューアー アプリで入力イメージのステレオ アナグリフを表示し、距離ツールを使用して対応する点のペア間の距離を測定します。測定値に応じて MaxDisparity を変更します。

平方ブロックのサイズ。'BlockSize' と [5,255] の範囲の奇数の整数で構成されるコンマ区切りのペアとして指定します。この値は、平方ブロックのサイズの幅を設定します。関数は、ピクセルの平方ブロックを使用して I1I2 の比較を行います。BlockSize は、実数、有限、非スパースでなければなりません。

コントラストのしきい値の範囲。'ContrastThreshold' と (0,1] の範囲のスカラー値で構成されるコンマ区切りのペアとして指定します。コントラストのしきい値は、コントラスト値の許容範囲を定義します。このパラメーターの値を大きくすると、信頼性が低いとマークされるピクセルの数が少なくなります。ContrastThreshold は、実数、有限、非スパースでなければなりません。

一意性の最小値。'UniquenessThreshold' と非負の整数で構成されるコンマ区切りのペアとして指定します。このパラメーターの値を大きくすると、関数によって信頼性が低いとマークされるピクセルの数が多くなります。ピクセルの一意性の値が小さい場合、そのピクセルについて計算された視差の信頼性が低いことを示します。しきい値を 0 に設定すると、一意性のしきい値処理が無効になります。UniquenessThreshold は、実数、有限、非スパースでなければなりません。

関数は、一意性を、最適な視差推定と最適性が低い視差推定の比率として定義します。次に例を示します。

K を最良の推定視差、V を対応する SAD (差の絶対値の和) 値とします。
V を視差範囲全体での SAD の最小値、v を K、K-1 および K+1 を除く視差範囲全体での SAD の最小値であるとします。
v < V * (1+0.01*UniquenessThreshold) の場合、関数はピクセルの視差について信頼性が低いとマークします。

2 点間の左から右へのイメージ チェックの最大距離。'DistanceThreshold' と非負の整数で構成されるコンマ区切りのペアとして指定します。このパラメーターの値を大きくすると、信頼性が低いとマークされるピクセルの数が少なくなります。逆に、距離のしきい値の値を小さくすると、視差マップの信頼性が高くなります。このパラメーターを空行列 [] に設定すると無効になります。DistanceThreshold は、実数、有限、非スパースでなければなりません。

距離のしきい値は、I1 の点と I2 で検出された同じ点の間の最大距離を指定します。関数は距離を検出し、次の方法でピクセルにマークします。

p1 をイメージ I1 の点とします。
手順 1: 関数がイメージ I2 で点 p1 の最適一致を検索し (左から右へのチェック)、点 p2 を検出します。
手順 2: 関数がイメージ I1 で点 p2 の最適一致を検索し (右から左へのチェック)、点 p3 を検出します。
検索によって返された p1 と p3 の間の距離が DistanceThreshold より大きい場合、関数は点 p1 の視差について信頼性が低いとマークします。

最小テクスチャしきい値。'TextureThreshold' と [0, 1) の範囲のスカラー値で構成されるコンマ区切りのペアとして指定します。テクスチャしきい値は、信頼性が高いと見なされるピクセルの最小テクスチャ値を定義します。ピクセルのブロックのテクスチャの値が小さいほど、ピクセルについて計算された視差の信頼性が低くなります。このパラメーターの値を大きくすると、信頼性が低いとマークされるピクセルの数が多くなります。このパラメーターを 0 に設定すると無効になります。このパラメーターは Method'BlockMatching' に設定した場合にのみ適用されます。

ピクセルのテクスチャは、ピクセルの周りの BlockSize x BlockSize のウィンドウに対して計算された飽和コントラストの和として定義されます。関数は、テクスチャが次のように定義された値より小さくなると、ピクセルについて計算された視差の信頼性が低いと見なしてマークします。

Texture < X* TextureThreshold * BlockSize2

X は、入力イメージ I1I2 のクラスによってサポートされる最大値を表します。

TextureThreshold は、実数、有限、非スパースでなければなりません。

出力引数

すべて折りたたむ

ステレオ イメージのペアの視差マップ。M 行 N 列の 2 次元グレースケール イメージとして返されます。関数は、入力イメージ I1I2 と同じサイズの視差マップを返します。出力の各要素は、イメージ参照の対応ピクセルの視差を I1 として指定します。返される視差の値は、116 ピクセルに丸められます。

関数は、次の 3 つの手順で視差マップを計算します。

  1. ソーベル フィルターを使用してイメージのコントラストの測定値を計算します。

  2. ブロック マッチングと差の絶対値の和 (SAD) を使用して、各ピクセルの視差を計算します。

  3. オプションで、信頼性の低い視差値を含むピクセルをマークします。関数は、ピクセルを -realmax('single') によって返された値に設定します。

ヒント

結果として得られた視差マップにノイズが多く含まれていると思われる場合、DisparityRange を変更してみてください。視差の範囲は、2 つのカメラ間の距離と、カメラと対象オブジェクト間の距離によって異なります。カメラとカメラの間隔が広い、またはオブジェクトとカメラが接近している場合には、DisparityRange の値を大きくします。構成に適切な視差を判定するには、イメージ ビューアー アプリで入力イメージのステレオ アナグリフを表示し、距離ツールを使用して対応する点のペア間の距離を測定します。測定値に応じて MaxDisparity を変更します。

参照

[1] Konolige, K., Small Vision Systems: Hardware and Implementation, Proceedings of the 8th International Symposium in Robotic Research, pages 203-212, 1997.

[2] Bradski, G. and A. Kaehler, Learning OpenCV : Computer Vision with the OpenCV Library, O'Reilly, Sebastopol, CA, 2008.

[3] Hirschmuller, H., Accurate and Efficient Stereo Processing by Semi-Global Matching and Mutual Information, International Conference on Computer Vision and Pattern Recognition, 2005.

拡張機能

バージョン履歴

R2011b で導入

すべて折りたたむ

R2019a: 関数 disparity は削除予定

関数 disparity は将来のリリースで削除される予定です。代わりに disparityBM または disparitySGM を使用してください。ブロック マッチング法を使用して視差マップを計算するには、disparityBM を使用します。セミグローバル マッチング法を使用して視差マップを計算するには、disparitySGM を使用します。