顕微鏡写真での楕円形粒子の検出。 画像内の楕円を見つけるための新しいアルゴリズム

は顕微鏡写真をいじっています 。 科学は静止していません(その記事がなくて2か月で1年が経ちました!)。そして、他のオブジェクトを認識する必要があります。









しかし、ここでは、dulしみなく:精度は非常に高いはずです。

具体的には、この問題は最近(ほぼ11月末に)発生し、研究と仕事から自由時間で解決されました。

了解 ! 記事は非常に大きく、多くの写真であることが判明しました。 しかし、過度の数学なし。



問題を定式化しましょう: 写真に描かれた図の輪郭を完全に特徴付けるパラメーターを取得します





ここで私は利点があります。これらの粒子がどのように作られるかを知っています。また、それらは常に楕円形であり、この形状が理想的な傾向があることも知っています。 理想的な楕円は、2次曲線方程式で記述されます。



Ax 2 + Bxy + Cy 2 + Dx + Ey + F = 0



したがって、タスクはこれらすべてのパラメーターを見つけることです。 それらを見つけるには、明らかに楕円上にある6点の座標を見つける必要があります(点の数=上記の完全な2次方程式の未知数の数):必要な楕円のすべてのパラメータを見つけることができます( 楕円読み取りで6点を近似する方法のために)以下、別の問題を解決しています )。 実際、ユーザーがマウスで6ポイントを突くことができるプログラムをすぐに作成し、プログラムは楕円の領域を示しました。 それはすぐに書かれ、彼女の助けを借りて一週間前に私の学期論文を擁護しました。

しかし、ポイントを自動的に選択する方法は? 非常に簡単:数独の解決に関する記事を覚えていますか? そこで、著者は画像の特別なポイントを見つけるために優れたアルゴリズムを使用しています(画像の境界線を読み取ります)。



要するに、その本質は何ですか:境界を見つけるために、1つの強度境界(0から255の範囲)を設定せず、ピクセルを白または黒で再描画します(強度が指定された境界よりも小さい場合、ピクセルは黒です-それ以外の場合-白)。 このアプローチはOtsuメソッドで使用され、実行速度以外には良い方法はありません。 非常に狭いアルゴリズム。 代わりに、「フローティング」強度境界線を使用することをお勧めします。 調べたピクセルの周囲に既知のサイズの領域が選択されています(サイズが11x11ピクセルの領域を使用しました)。 その強度が領域内のすべてのピクセルの平均強度よりも低い場合、それは背景であり、白で塗りつぶされます。 強度が大きい場合は、黒で塗りつぶされます。 以下の図に短い図を示します。



このアルゴリズムの結果はほぼ満足です。 このアルゴリズムに従うことで得られる近似結果は次のとおりです。







これを見て-すぐに、平均強度の値をわずかに「過大評価」することが決定されました。 この値を人為的に15単位上げた結果、この結果に至りました。







そして、この結果は私に完全よりも少し似合いました。 その上に、私の楕円の輪郭に加えて、実質的に何もないからです。 これ自体が優れています!



しかし、先に進む必要があります。 なぜこれを始めたのか覚えていますか? 楕円上にある6つの点から、2次曲線の完全な方程式のパラメーターを決定する必要があります。 現時点では、必要なふりをすることができる一連のポイント(ブラックポイント)しか見つからなかったため、最終決定にはまだほど遠い状態です。 しかし、すべてのポイントが私たちに適しているわけではありません...なぜ、私は写真で示すことにしました:







ポイントが互いに近すぎる場合、指定された6つのポイントを通して、同じ信頼性で少なくとも2つの楕円を描画できます。 したがって、選択可能な6つのポイントは可能な限り離れている必要があります。 さらに、明らかに楕円の上に横たわっています。

考えるべきことがありましたが、私は本当に一週間掛けました。 しかし、彼の法王、Math.Rand()関数は私を救った。

配列からランダムに6ポイントを取得し、それらから楕円を作成することにしました。 何度も何度も(経験的に、サイズが700x700ピクセルの画像の場合、2000回の反復で十分です)

結果は私の期待をすべて満たしました。 6つのポイントを楕円に変換する関数(アルゴリズムは以下に示します)は、楕円の中心の座標、2つの軸の長さ、座標軸に対する回転角度を返しました。 明確にするために、私は再び少しスケッチを描くことにしました。





得られたデータから、依存関係x = f(y)を構築することができました。ここで、(x、y)は楕円の中心の座標です。 また、依存関係R 1 = f(R 2 )-R 1およびR 2は楕円の軸の長さです。 得られた座標が最も頻繁に見つかるポイントは、私たちが望むポイントです(座標の座標、トートロジーについては申し訳ありません)。



わかりやすくするために、平面上の結果の配列の「スプレー」の断片を示します。

楕円の中心の座標をスプレーする:



肉眼で見ることができるように、最大​​値はおよそX = 210、Y = 220にあります。 これらの点は、画像の中心の座標です。



ポイントの最大蓄積を探す方法は? Oooh ...私はここで(Habréで) 質問をしました -ある人( Monnorochに指を突くつもりはありません) 、憎しみの光線が彼の方向にあるように私に助言しました。 しかし、PMを含め、回答したすべての人に感謝します! しかし、私はまだ自分の道を進んだ。

空のカウンター[] []配列を作成して、元の画像としての次元を作成しました。 そして彼は、2000回の反復の結果として得られたポイント(x、y)の配列を整理し始めました。 フィールドが空の場合、当然何もしませんでした。 ただし、ポイントが発生するとすぐに、最初にカウンター[x] [y] =カウンター[x] [y] +2を実行し、次にすべてのネイバーのカウンターを増やします。 これらのスキームはご容赦ください。しかし、もう1つあります:)





まったく同一の画像であり、楕円の軸の長さの結果の配列をソートする場合、記事を完全に混乱させないために、それらの画像は提供しません。 私を信じて-まったく同じ。

まあ、それだけです。 最大値が見つかりました。つまり、座標、軸の長さ、回転角度がわかっています。 それだけです! :)

記事の最初の写真のアルゴリズムの結果:





PS 2巻(2011年!)ホルストマンをくれたhabruiser ruedjに感謝します。そして、最終的にマルチスレッドで多かれ少なかれ正しく通信する方法を学びました。 コアi3-2100(Sandy Bridgeラインナップの中で最も弱いモデルの1つ)の700x700ピクセルの画像のアルゴリズム全体は、約1000msかかります。



数学的部分

6点での2次曲線の完全な方程式のパラメーターの検索。 ここで説明する必要がありますか? そこでは非常に難しいとは言いません(ただ長い間書くだけです)。



All Articles