USB 顕微鏡のオートフォーカス アルゴリズム
質問
低コストの USB 顕微鏡用のオートフォーカス システムを設計しようとしています。私は、フォーカスノブを調整できる高精度のPAPモーターを備えたハードウェア面を開発してきました。 顕微鏡, 、そして今、私は難しい部分にいます。
ソフトウェアをどのように実装するかを考えています。ハードウェアには 2 つの USB ポートがあり、1 つは顕微鏡カメラ用、もう 1 つはモーター用です。私の最初のアイデアは、顕微鏡から画像を取得し、モーターを前後に動かすことができるアプリケーションを C# で書くことです。今のところはうまくいきました :)
オートフォーカスについて少し助けが必要ですが、どうやって実装すればよいでしょうか?これに適したアルゴリズムはありますか?それとも、私の仕事に役立つ画像処理ライブラリでしょうか?
Googleで検索しましたが、成功しませんでした...助け/アイデア/推奨事項をいただければ幸いです。
どうもありがとう :)
編集: ご回答ありがとうございます。すべてのオプションを試して、結果 (またはさらに質問) をここに返します。
解決
最も重要な部分は、画像の焦点がどの程度ずれているかを示すコードです。焦点の合っていない画像では高周波データが失われるため、次のようなことを試してみます。
long CalculateFocusQuality(byte[,] pixels)
{
long sum = 0;
for(int y = 0; y<height-1; y++)
for(int x=0; x<width-1; x++)
{
sum += Square(pixels[x+1, y] - pixels[x, y]);
sum += Square(pixels[x, y] - pixels[x, y+1]);
}
return sum;
}
int Square(int x)
{
return x*x;
}
画像にノイズが多い場合、このアルゴリズムはうまく機能しません。その場合は、ダウンサンプリングするか、より複雑なアルゴリズムを使用することができます。
あるいは、ピクセル値の変動を計算するという別のアイデアもあります。
long CalculateFocusQuality(byte[,] pixels)
{
long sum = 0;
long sumOfSquares = 0;
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
{
byte pixel=pixels[x,y];
sum+=pixel;
sumofSquares+=pixel*pixel;
}
return sumOfSquares*width*height - sum*sum;
}
これらの関数は単色画像で動作し、RGB 画像の場合はチャネルの値を合計するだけです。
この機能を使用してフォーカスを変更して最大化しようとします CalculateFocusQuality
. 。複数の試行を連続して行うことで品質が向上した場合はステップサイズを増やし、ステップによって品質が低下した場合はステップサイズを減らし、方向を逆にします。
他のヒント
顕微鏡の自動焦点合わせは、光学研究における長年のテーマです。
関連するアルゴリズムについて少し学ぶことができます ここ.
デフォーカスをどのように測定するかだけでなく、最適な方法で光軸を移動する方法や、残留収差をアルゴリズム的に補正する方法も問題となります。
ひーっ!
についての情報があります ウィキペディア
技術的には、次のように実装できます。 ハイパスフィルターといくつかのシステム 意識的にレンズを動かします フィルタ出力が最大になるポイント。デジタル処理は必要ありません
また、「オートフォーカス アルゴリズム」でグーグル検索して得た最初の 6 件のうち 5 件には、関連性の高い有用な情報が含まれているようです (ただし、論文の詳細をすべて表示するには支払いが必要な場合が 1 つまたは 2 つあります)。
同様のタスクを解決しようとした私の経験のほんの一部です。私のシステムでは 200 倍の倍率が使用されています。ステッパーの Z 方向の解像度は 0.001um。
私が直面した問題:-震える。理論的には良い位置にある画像でも、突然の揺れにより評価が悪くなってしまう可能性があります。私のシステムの API では、z-axix の移動とイメージの作成を並行して行うことができなかったため、段階的に移動して順番にキャプチャする必要がありました。移動停止のたびに揺れが発生しました。興味深いことに、揺れは上に移動するときよりも下に移動するときの方が大きかった。
- 機械的な精度。コントローラー内のステッパーの位置が機械的な位置と異なる可能性があるため、スキャンを実行して理論的に最適な位置に移動すると、エラーが発生する可能性があります。
-暴露:用途によっては画像の明るさが異なる場合がありますので、露出を調整する必要があります。焦点評価アルゴリズム (明るさが計算に含まれるかどうか) によっては、露出を固定する必要がある場合があります。その結果、鶏が先か卵が先かという問題が発生します。画像の明るさが不明な場合は露出を設定する方法、必要な露出が不明な場合は焦点を合わせる方法です。
最後に、機械的な問題を避けるために、フォーカス中に見つかった最良の画像を(再)保存し、最後にそれを返しました。フォーカス値のアルゴリズムに関しては、色全体 (ヒストグラム幅) と組み合わせたエッジを探すのが最善でした。ただし、当然ながら、それは処理する画像の種類によって異なります。
よろしく ヴァレンティン・ハイニッツ