В Emgu.CV что означают эти пороговые значения и есть ли лучший способ обнаружить круг? - PullRequest
1 голос
/ 01 апреля 2011

Фон

Вот мой код Emgu.CV для получения изображения и рисования найденных в нем кружков (в основном это код из проекта ShapeDetection в решении Emgu.CV.Examples, который поставляется с загрузкой 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);

Вот изображение:

Image of circles

Вопросы

  1. ОК, поэтому я знаю, каково пороговое значение в ThresholdBinary. Поскольку я получаю двоичное изображение из полутонового изображения, это интенсивность серого на картинке. Это работает, поскольку интенсивность круга серой шкалы на изображении составляет от 150 до 185. Я предполагаю, что это то же самое для первого аргумента HoughCircles.

    Что я не знаю, так это то, что представляют собой circleAccumulatorThreshold, разрешение аккумулятора и минимальное расстояние (2-й, 3-й и 4-й аргументы до HoughCircles) или какие значения должны идти туда. У меня, очевидно, нет правильных значений, потому что круг на картинке не «правильно заштрихован».

  2. Мой второй вопрос: есть ли лучший способ найти круг? Мне нужно иметь возможность обнаруживать этот круг во многих типах света (то есть интенсивность цвета круга может быть низкой, например, 80 или ниже) и получать его размеры на рисунке. Как лучше всего сочетать круг? Должен ли я сделать круг другого цвета и посмотреть на исходное изображение для этого цвета? Есть еще идеи?

Спасибо

Ответы [ 2 ]

3 голосов
/ 02 июня 2013
Аккумулятор
  • - это количество очков, которое необходимо «накапливать», чтобы считаться кругом.Более высокие числа означают меньшее количество обнаруженных кругов.
  • Разрешение - насколько близко должна быть точка к предлагаемому кругу.По сути, «размер» пикселя.
  • MinDistance - это то, насколько близко окружности могут быть друг к другу.В вашем примере у вас есть 3 круга, все очень близко друг к другу.Увеличение минимального расстояния предотвратит перекрывающиеся круги и вместо этого просто нарисует один.

Что касается вашего ответа на номер два, то размытие изображения, преобразование в оттенки серого, затем пороговое значение для устранения различий в освещении является обычным решением

1 голос
/ 02 февраля 2013

Хотя этот вопрос "очень" старый, я хотел бы предложить ответ на вопрос № 2 для тех, кто может столкнуться с подобной проблемой.

Что вы можете сделать:

  1. Порог изображения для удаления фона,
  2. Обнаружение объектов на изображении,
  3. Расчет округлостикруга (http://en.wikipedia.org/wiki/Shape_factor_(image_analysis_and_microscopy)), это должно быть 1, если это круг. Использование метода FindContours (в emgucv) предоставляет всю информацию, которую вам нужно рассчитать для площади и периметра круга. Затем вы можете использоватьэти данные, чтобы получить размер вашего обнаруженного круга.
...