1

バックグラウンド

これが、画像を取得してその中にある円を描くための私のEmgu.CVコードです(主にEmgu.CVのShapeDetectionプロジェクトからのコード。EmguCVダウンロードに付属のサンプルソリューション):

//Load the image from file
Image<Bgr, Byte> img = new Image<Bgr, byte>(myImageFile);

//Get and sharpen gray image (don't remember where I found this code; prob here on SO)
Image<Gray, Byte> graySoft = img.Convert<Gray, Byte>().PyrDown().PyrUp();
Image<Gray, Byte> gray = graySoft.SmoothGaussian(3);
gray = gray.AddWeighted(graySoft, 1.5, -0.5, 0);

Image<Gray, Byte> bin = gray.ThresholdBinary(new Gray(149), new Gray(255));

Gray cannyThreshold = new Gray(149);
Gray cannyThresholdLinking = new Gray(149);
Gray circleAccumulatorThreshold = new Gray(1000);

Image<Gray, Byte> cannyEdges = bin.Canny(cannyThreshold, cannyThresholdLinking);

//Circles
CircleF[] circles = cannyEdges.HoughCircles(
    cannyThreshold,
    circleAccumulatorThreshold,
    4.0, //Resolution of the accumulator used to detect centers of the circles
    15.0, //min distance 
    5, //min radius
    0 //max radius
    )[0]; //Get the circles from the first channel

//draw circles (on original image)
foreach (CircleF circle in circles)
    img.Draw(circle, new Bgr(Color.Brown), 2);

これが画像です:

サークルの画像

質問

  1. OK、それで私はのしきい値が何であるかを知っていThresholdBinaryます。グレースケール画像からバイナリ画像を取得しているので、それは画像のグレーの強度です。これは、写真のグレースケール円の強度が150〜185であるため、機能します。これは、の最初の引数でも同じであると思いますHoughCircles

    私が知らないのは、circleAccumulatorThreshold、アキュムレータの解像度、および最小距離(2番目、3番目、および4番目の引数からHoughCircles)、またはそこに配置する値です。写真の円が正しく「ハフ」されていないため、明らかに正しい値がありません。

  2. 私の2番目の質問は、円を見つけるためのより良い方法はありますか?多くの種類の光でこの円を検出し(つまり、円の色の強度が80以下のように低い場合があります)、写真でその寸法を取得できる必要があります。円を一致させるための最良の方法は何ですか?円を別の色にして、元の画像でその色を探す必要がありますか?他のアイデアはありますか?

ありがとう

4

2 に答える 2

3
  • アキュムレータは、円と見なされるために「蓄積」する必要のあるポイントの数です。数値が大きいほど、検出される円が少なくなります。
  • 解像度は、ポイントが提案された円にどれだけ近くなければならないかです。基本的に、ピクセルの「サイズ」。
  • MinDistanceは、円が互いにどれだけ接近できるかを示します。あなたの例では、3つの円がすべて互いに非常に接近しています。最小距離を増やすと、円が重なるのを防ぎ、代わりに1つだけ描画します。

2番目の答えとしては、画像をぼかし、グレースケールに変換してから、照明の違いを排除するためのしきい値が通常の解決策です。

于 2013-06-02T02:00:41.663 に答える
1

この質問は「かなり古い」ものですが、同様の問題に遭遇する可能性のある人のために、質問2の回答を提案したいと思います。

あなたができることは次のとおりです。

  1. 背景を削除するために画像をしきい値設定し、
  2. 画像内のオブジェクトを検出し、
  3. 円の真円度を計算します(http://en.wikipedia.org/wiki/Shape_factor_(image_analysis_and_microscopy))。円の場合は1になります。FindContoursメソッド(emgucv内)を使用すると、円の面積と周囲長について計算する必要のあるすべての情報が提供されます。次に、これらの情報を使用して、検出された円の寸法を取得できます。
于 2013-02-02T16:49:08.443 に答える