質問

テスト自動化作業用の画像焦点アルゴリズムを開発しようとしています。AForge.net は成熟した .net フレンドリーなシステムだと思われるため、私は AForge.net を使用することにしました。

残念ながら、オートフォーカスアルゴリズムをゼロから構築することに関する情報が見つからないようなので、最善を尽くしてみました。

画像を撮ります。グレースケールのエッジ輪郭を生成するソーベルエッジ検出フィルターを適用します。ヒストグラムを生成し、標準開発を保存します。カメラを被写体に一歩近づけて、別の写真を撮ります。標準開発が以前のものよりも小さい場合、より焦点が当てられます。そうしないと、写真を撮るのに最適な距離を過ぎてしまいます。

もっと良い方法はありますか?

アップデート:ちなみに、これには大きな欠陥があります。私が理解しているように 過去 最適なフォーカスポイント、私の「ピントの合った画像」の値は増加し続けています。距離/焦点値を見ると放物線的な関数が期待されるかもしれませんが、実際には、より対数的な関数が得られます。

アップデート 2:さて、これに戻り、私たちが検討している現在の方法にはいくつかの既知のエッジが与えられています(写真内のオブジェクトが何であるかは正確にわかっています)。手動でピクセル強度を比較します。結果のグラフが急勾配になるにつれて、より焦点が合います。コア アルゴリズムが matlab から C# に移植されたら、コードを投稿します (そう、matlab..:S)

アップデート 3:やあ、最終更新。またこれに戻ってきました。最終的なコードは次のようになります。

ステップ1:画像リストから画像を取得(焦点を合わせたポイントを通って100枚の写真を撮りました)

ステップ2:フォーカスしているオブジェクトのエッジを見つけます (私の場合、常に同じ場所にある長方形のオブジェクトなので、一方のエッジの大きい長方形と狭い長方形をトリミングします)

ステップ3:トリミングされた画像の horizo​​ntalIntensityStatistics (Aforge.net クラス) を取得します。

ステップ4:ヒストグラムを取得します(私の場合はグレー)

ステップ5:ヒストグラムの値の導関数を求めます

ステップ6:傾きが最も大きいときは、最も集中しているポイントにいるときです。

役に立ちましたか?

解決

ニーズに対しては少し単純すぎるかもしれませんが、隣接するピクセルとの差を調べる単純なアルゴリズムで良い結果が得られました。2 離れたピクセルの差の合計は、画像のコントラストの合理的な尺度であると思われます。70年代のブレナーによるオリジナルの論文は見つかりませんでしたが、次のような文献で言及されています。 http://www2.die.upm.es/im/papers/Autofocus.pdf

もう 1 つの問題は、画像の焦点が極端にずれている場合、焦点情報がほとんどないため、どの方向に「近づいている」のか、または極大値を回避しているのかを判断するのが難しいことです。

他のヒント

NASA キュリオシティ火星探査機で使用されている技術をご覧ください。

このテクニックはこの記事で説明されています

EDGETT、Kenneth S.、他Curiosity の Mars Hand Lens Imager (MAHLI) の調査。 宇宙科学のレビュー, 2012, 170.1-4: 259-317.

として利用可能です PDFはこちら.

記事から引用:

7.2.2 オートフォーカス

オートフォーカスは、Mahliが火星に焦点を当てる主要な方法であると予想されています。Autofocusコマンドは、指定された開始モーターカウント位置に移動して画像を収集し、指定されたステップ数を移動して別の画像を収集するようにカメラに指示し、指定されたモーターでそれぞれ分離された総数の画像に到達するまでそうし続けます。増分をカウントします。これらの画像はそれぞれJPEGです 圧縮(Joint Photographic Experts Group;CCITT (1993)を参照) 同じ圧縮品質係数が適用されます。それぞれのファイルサイズ 圧縮された画像はシーンの詳細の尺度であり、これは フォーカスの機能(ピントの合っている画像は、ぼやけた画像よりも詳細を示しています。 同じシーンの焦点が合っていないビュー)。図に示すように。23の場合、 カメラは、JPEGファイルサイズとモーターの関係を決定します カウントし、隣接する 3 つの最大ファイル サイズに放物線を当てはめます。放物線の頂点は、最適な焦点の推定値を提供します モーターカウント位置。この決定を下すと、MAHLI は レンズフォーカスグループを最適なモーター位置に導き、画像を取得します。この画像は保存され、以前の画像は オートフォーカス位置は保存されません。

オートフォーカスは、Mahliの視野全体で実行することも、研究対象のオブジェクトを含むシーンの部分に対応するサブフレームで実行することもできます。主題の性質とMahliのロボットアームポジショニングにおける不確実性の知識に応じて、ユーザーは中心的なオートフォーカスサブフレームを取得することを選択するか、ポジショニング知識がどこにあるかを判断するのに十分な場合は、オフセンターオートフォーカスサブフレームを選択することができます。サブフレームを配置する必要があります。サブフレームを使用してオートフォーカスを実行することを強くお勧めします。これにより、通常、被験者は完全なCCDに適用される場合よりも被験者の焦点が向上するためです。さらに、サブフレームを使用したオートフォーカスから得られるモーターカウント位置は、通常、ピクセルスケールからの作動距離のより正確な決定をもたらします。

以下は図 23 です。

Autofocus in NASA Curiosity Mars Rover

このアイデアは、この回答でも提案されています。 https://stackoverflow.com/a/2173259/15485

これは役に立つかもしれません。これがカメラの AF システムの実際の仕組みです - パッシブオートフォーカス

コントラスト測定

コントラスト測定は、次の方法で実現されます。 センサー内のコントラストの測定 レンズを通して、フィールド。強度 の隣接画素間の差 センサーは、 画像の焦点を補正します。光学式 これにより、システムは 最大コントラストが検出されます。で この方法では、AFは関与しません 実際の距離測定と 通常、位相よりも遅い 検出システム、特に 薄暗い照明の下での操作。それはそうです ただし、別のセンサーを使用しないでください。 コントラスト検出オートフォーカスは、より多くすることができます flexible ( ソフトウェア)など、潜在的にはそれ以上のもの 正確。これは、 ビデオカメラと消費者レベル シャッターのないデジタルカメラと 反射鏡。一部のデジタル一眼レフカメラ( オリンパスE-420、パナソニックL10、ニコン 三脚のD90、ニコンD5000、ニコンD300 モード、Canon EOS 5D Mark II、Canon EOS 50D)に焦点を合わせるときは、この方法を使用します。 ライブビューモード。新しい レンズ交換式、マイクロ フォーサーズ、コントラストのみを使用 測定オートフォーカス、および言われる Phaseに匹敵する性能を提供 システムを検出します。

私は自分で構築したことはありませんが、最初に考えたのは、画像の一部に対して 2D DFT を実行することです。焦点が合っていない場合、高周波は自動的に消えます。

遅延プロトタイプの場合は、画像の領域を JPEG (高品質) で圧縮して、出力ストリームのサイズを確認してみることができます。ファイルが大きいということは詳細が多く、つまり画像に焦点が合っていることを意味します。カメラのノイズが多すぎないように注意してください。また、当然ながら、さまざまなシーンでファイル サイズを比較することはできないことに注意してください。

ソーベルは適切な選択ですが、私はおそらく、いくつかの小さな代表的な領域にわたる x 方向と y 方向の投影に対してエッジの大きさの計算を行うことを選択するでしょう。OpenCV に基づくもう 1 つの .NET フレンドリーな選択肢は @ です。 http://www.emgu.com/wiki/index.php/Main_Page.

標準偏差が最良の選択なのかどうか疑問に思います。画像が鮮明になると、ソーベル フィルター画像のエッジには明るいピクセルが含まれますが、同時にエッジが薄くなるため、明るいピクセルは少なくなります。ソーベル画像の最大 1% のピクセル値の平均を使用してみてはいかがでしょうか?

フォーカス メトリックの別のフレーバーは次のとおりです。

複数の画像を取得し、平均化します (ノイズ除去)。次に、平均化された画像を FFT 変換し、高周波と低周波のエネルギー比を使用します。この比率が高いほど、集中力が高まります。Matlab デモは、ツールボックスのデモ内で (平均化ステージを除く) 利用できます :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top