Можно ли найти край «пятнистой» области в emgucv?

У меня есть изображение, которое выглядит так:

original

и я хочу найти края темной части вот так (красные линии — это то, что я ищу):

required

У меня есть попробовал несколько подходов, и ни один из них не сработал, поэтому я надеюсь, что есть гуру emgu, готовые помочь мне...

Подход 1

  • Преобразовать изображение в оттенки серого
  • Удалить шум и инвертировать
  • Удалить все, что не очень яркое
  • Получите хитрость и многоугольники

Код для этого (я знаю, что должен правильно распоряжаться вещами, но я сокращу код):

var orig = new Image<Bgr, byte>(inFile);

var contours = orig
    .Convert<Gray, byte>()
    .PyrDown()
    .PyrUp()
    .Not()
    .InRange(new Gray(190), new Gray(255))
    .Canny(new Gray(190), new Gray(255))
    .FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
                  RETR_TYPE.CV_RETR_TREE);

var output = new Image<Gray, byte>(orig.Size);    
for (; contours != null; contours = contours.HNext)
{
    var poly = contours.ApproxPoly(contours.Perimeter*0.05,
                                   contours.Storage);
    output.Draw(poly, new Gray(255), 1);
}
output.Save(outFile);

Вот результат:

approach 1 result

Подход 2

  • Преобразовать изображение в оттенки серого
  • Удалить шум и инвертировать
  • Удалить все, что не очень ярко
  • Получить хитрость, а затем линии

Код для этого:

var orig = new Image<Bgr, byte>(inFile);

var linesegs = orig
    .Convert<Gray, byte>()
    .PyrDown()
    .PyrUp()
    .Not()
    .InRange(new Gray(190), new Gray(255))
    .Canny(new Gray(190), new Gray(255))
    .HoughLinesBinary(
        1,
        Math.PI/45.0,
        20,
        30,
        10
    )[0];

var output = new Image<Gray, byte>(orig.Size);    
foreach (var l in linesegs)
{
    output.Draw(l, new Gray(255), 1);
}
output.Save(outFile);

Эторезультат:

approach 2 result

Примечания

Я попытался отрегулировать все параметры этих двух подходов и добавить сглаживание, но я никогда не мог получить простые края, которые мне нужны, потому что, я полагаю, более темная область не является сплошным цветом.

Я также пробовал расширять и размывать, но параметры, которые я должен указать для них, настолько высоки, чтобы получить один цвет, что я в конечном итоге добавляю некоторые серые элементы справа и теряю точность.

10
задан karlphillip 24 December 2013 в 14:35
поделиться