Я пытаюсь определить, проходит ли линия через изображение или нет, используя обнаружение линии трансформации С# и AForge. В том же контексте я думаю о лучшем решении, которое обнаруживает, что изображение четкое (без строк), чтобы вернуть ложное значение и наоборот. У меня есть следующее изображение, и я хочу проверить, проходит ли строка через него, я верну true, иначе return false:
http://s10.postimg.org/3sn8wari1/image.png
Я использовал следующий код, чтобы получить количество строк, но кажется, что это неточно или я плохо использую алгоритм.
AForge.Imaging.Image.FormatImage(ref SEChild);
// lock the source image
BitmapData sourceData = SEChild.LockBits(
new System.Drawing.Rectangle(0, 0, SEChild.Width, SEChild.Height),
ImageLockMode.ReadOnly, SEChild.PixelFormat);
// binarize the image
UnmanagedImage binarySource = filter.Apply(new UnmanagedImage(sourceData));
HoughLineTransformation lineTransform = new HoughLineTransformation();
lineTransform. = 10;
// apply Hough line transofrm
lineTransform.ProcessImage(binarySource);
HoughLine[] lines = lineTransform.GetLinesByRelativeIntensity(0.5);
if (lines.Count() > 0)
{
Result += "NW: Yes!\n";
}
else
{
Result += "NW: No!\n";
}
Я применил решение, мощное со всеми кривыми, кроме прямых.
Я использовал библиотеку AForge.net и впоследствии использовал следующие шаги, как показано в коде:
Код:
private bool CheckLines(Bitmap image, Color filterColor)
{
EuclideanColorFiltering ColorFilter = new EuclideanColorFiltering();
// set center colour and radius
AForge.Imaging.RGB color = new RGB(filterColor.R, filterColor.G, filterColor.B, filterColor.A);
ColorFilter.CenterColor = color;
ColorFilter.Radius = 100;
// Apply the filter
ColorFilter.ApplyInPlace(image);
// Define the Blob counter and use it!
BlobCounter blobCounter = new BlobCounter();
blobCounter.MinWidth = 5;
blobCounter.MinHeight = 5;
blobCounter.FilterBlobs = true;
//blobCounter.ObjectsOrder = ObjectsOrder.Size;
blobCounter.ProcessImage(image);
System.Drawing.Rectangle[] rects = blobCounter.GetObjectsRectangles();
if (rects.Length > 0)
{
return true;
}
return false;
}