画像のしきい値処理を正常に行い、画像内のエッジを見つけることができます。私が苦労しているのは、黒いエッジの角度を正確に抽出しようとすることです。
現在、黒エッジの極値をとり、atan2 関数で角度を計算していますが、エイリアシングのため、選択したポイントによって角度に多少のばらつきが生じます。角度を計算するポイントを選択する信頼できるプログラム可能な方法はありますか?
画像例:
たとえば、Gimp Measure ツールの角度は 3.12°、
画像のしきい値処理を正常に行い、画像内のエッジを見つけることができます。私が苦労しているのは、黒いエッジの角度を正確に抽出しようとすることです。
現在、黒エッジの極値をとり、atan2 関数で角度を計算していますが、エイリアシングのため、選択したポイントによって角度に多少のばらつきが生じます。角度を計算するポイントを選択する信頼できるプログラム可能な方法はありますか?
画像例:
たとえば、Gimp Measure ツールの角度は 3.12°、
あなたの問題には解決策がほとんどありませんが、すべてに非常に重要な問題が1つあり、それを無視しているようです。注: 画像内で幾何学的計算を行う場合は、使用する点が互いにできるだけ離れている必要があります。1 つの正方形内で 2 ポイントを獲得しています。これらの点は互いに非常に接近しているため、点のピクセル位置のわずかな誤差が角度の大きな誤差につながります。画像に多くの正方形があるのに、なぜ単一の正方形のみを使用するのですか? ここにいくつかの解決策があります:
(gx,gy)
計算し、各ピクセルの勾配の角度を計算し、角度のatan(gy,gx)
ヒストグラムを作成するだけです。3° と 93° 付近に 2 つの重要なピークがあります。ヒストグラムの最大値を検索してピークを見つけるだけです。これは、画像に多くのノイズがある場合でも、アンチエイリアスや jpg アーティファクトがある場合でも、画像に他の描画がある場合でも機能します。ただし、導関数を計算する前に、画像を大幅に平滑化する必要があることを忘れないでください。 これをコーディングするためにどの C++ ライブラリを使用していますか?
Jerry の言うとおりです。実際に画像にしきい値を適用すると、2 ビットの黒または白になります。あなたが適用した可能性があるのは、代わりに一種のリミッターです。
使用している可能性のあるリミッターを適用してから、白以外のすべてのピクセルを黒にすることで、しきい値関数を作成できます (画像処理を自分でコーディングしている場合)。適切な設定があれば、正方形が分離され、角度を計算できるようになります。
これが完了すると、パス検索アルゴリズムを使用してエッジを見つけることができます。ほぼ直線的なパスが見つかった場合は、現在行っているように極値を使用して角度を決定できます。チェッカー ボードの回転は 90 度以内でのみ関連するため、角度はモジュロ 90 度または 2 ラジアンを超える pi である必要があります。
それが(どこにでも)正しい答えであるかどうかはわかりませんが、私の即時の反応は、2回しきい値を設定することです。1回目は黒以外が白として扱われ、もう1回は白以外が黒として扱われます。
それぞれの角度を見つけて、2 つの角度の間を補間します。