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