У меня есть изображение, которое выглядит так:
и я хочу найти края темной части так, как это (красные линии - это то, что я ищу):
Я пробовал несколько подходов, и никто из них не работал, поэтому я надеюсь, что там будет emgu гуру, желающий помочь мне...
Подход 1
- Преобразование изображения в оттенки серого
- Удалить шум и инвертировать
- Удалите все, что не очень яркое.
- Получить canny и многоугольники
Код для этого (я знаю, что я должен правильно распоряжаться вещами, но я сохраняю код коротким):
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);
Это результат:
Подход 2
- Преобразование изображения в оттенки серого
- Удалить шум и инвертировать
- Удалите все, что не очень яркое.
- Получить canny и затем строки
Код для этого:
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);
Это результат:
Примечания
Я попытался настроить все параметры на этих двух подходах и добавить сглаживание, но я никогда не могу получить простые ребра, которые мне нужны, поскольку, я полагаю, более темная область не является сплошным цветом.
Я также пробовал расширять и размывать, но параметры, которые я должен использовать для них, настолько высоки, чтобы получить один цвет, который я в конечном итоге включаю в себя некоторые из серого материала справа и теряю точность.