使用 AForge 进行彩色线条检测
Coloured Line Detection Using AForge
我有一个要求扫描各种图像的彩色线条,这个结果决定了我们如何处理图像,没有线条 = 删除,线条 = 保存。
通过简单地将每个像素的颜色与我们正在寻找的已知颜色列表进行比较,我已经充分满足了这一要求,如果我们发现超过某个像素阈值,那么我们很高兴上面有一些东西我们感兴趣的图像。
我最近不得不重新处理它,因为我们开始获得高度压缩的 Jpeg,并且(例如)红线最终由数百种红色阴影组成 - 我使它可靠地工作,但过程得到了我认为一定有更好的方法,所以我开始研究 AForge 以确定它是否可以用于检测不同颜色的线条。
我花了一天时间研究它,认为它会起作用,但需要一些指导以了解什么是最好的 approach/method,因为 CV 非常大领域,我暂时只需要学习其中很小的一部分。
这是其中一张图片的示例
在这种情况下,我想了解红线和蓝线。
我会无视黑色的。
我一直在阅读和测试一些关于 hough 线检测的东西,在检测黑白图像上的直线时取得了一些非常有限的成功,但找不到很多检测彩色曲线的例子。
我所寻找的只是关于 AForge 是否是最好的前进方向的一点指导(如果它甚至可以做我想做的事)以及一个关于过程会是什么样子的想法,这样我就可以去调查正确的东西!
以防将来这对其他人有用,我找到了一种方法,它仍然不完美,但提高了我们流程的可靠性。
第一步 -> 删除除我们感兴趣的颜色以外的所有颜色:
var c = Color.Red;
EuclideanColorFiltering filter = new EuclideanColorFiltering();
filter.CenterColor = new RGB(color.R, color.G, color.B);
filter.Radius = (short)radius;
filter.ApplyInPlace(input);
步骤 2 -> 转换为灰度
Grayscale.CommonAlgorithms.BT709.Apply(image);
步骤 3 -> 运行 通过 Hough 的结果
var lineTransform = new HoughLineTransformation();
lineTransform.ProcessImage(input);
HoughLine[] lines =
lineTransform.GetLinesByRelativeIntensity(_intensity);
第一步产生的结果与我过去通过扫描图像寻找特定颜色的像素得到的结果几乎相同,但是 HoughLineTransform 具有识别哪些像素形成一条线的效果 - 消除了很多噪音我们有高度压缩的 JPEGS。
仍然存在一些问题,因为我们过滤除我们感兴趣的颜色以外的所有颜色的方式并不适用于所有颜色,我们需要识别相当多的灰色阴影通过它可以勾勒出道路等的轮廓,因此仍有工作要做 - 但我上面描述的内容使我们更接近解决方案。
我有一个要求扫描各种图像的彩色线条,这个结果决定了我们如何处理图像,没有线条 = 删除,线条 = 保存。
通过简单地将每个像素的颜色与我们正在寻找的已知颜色列表进行比较,我已经充分满足了这一要求,如果我们发现超过某个像素阈值,那么我们很高兴上面有一些东西我们感兴趣的图像。
我最近不得不重新处理它,因为我们开始获得高度压缩的 Jpeg,并且(例如)红线最终由数百种红色阴影组成 - 我使它可靠地工作,但过程得到了我认为一定有更好的方法,所以我开始研究 AForge 以确定它是否可以用于检测不同颜色的线条。
我花了一天时间研究它,认为它会起作用,但需要一些指导以了解什么是最好的 approach/method,因为 CV 非常大领域,我暂时只需要学习其中很小的一部分。
这是其中一张图片的示例
在这种情况下,我想了解红线和蓝线。 我会无视黑色的。
我一直在阅读和测试一些关于 hough 线检测的东西,在检测黑白图像上的直线时取得了一些非常有限的成功,但找不到很多检测彩色曲线的例子。
我所寻找的只是关于 AForge 是否是最好的前进方向的一点指导(如果它甚至可以做我想做的事)以及一个关于过程会是什么样子的想法,这样我就可以去调查正确的东西!
以防将来这对其他人有用,我找到了一种方法,它仍然不完美,但提高了我们流程的可靠性。
第一步 -> 删除除我们感兴趣的颜色以外的所有颜色:
var c = Color.Red;
EuclideanColorFiltering filter = new EuclideanColorFiltering();
filter.CenterColor = new RGB(color.R, color.G, color.B);
filter.Radius = (short)radius;
filter.ApplyInPlace(input);
步骤 2 -> 转换为灰度
Grayscale.CommonAlgorithms.BT709.Apply(image);
步骤 3 -> 运行 通过 Hough 的结果
var lineTransform = new HoughLineTransformation();
lineTransform.ProcessImage(input);
HoughLine[] lines =
lineTransform.GetLinesByRelativeIntensity(_intensity);
第一步产生的结果与我过去通过扫描图像寻找特定颜色的像素得到的结果几乎相同,但是 HoughLineTransform 具有识别哪些像素形成一条线的效果 - 消除了很多噪音我们有高度压缩的 JPEGS。
仍然存在一些问题,因为我们过滤除我们感兴趣的颜色以外的所有颜色的方式并不适用于所有颜色,我们需要识别相当多的灰色阴影通过它可以勾勒出道路等的轮廓,因此仍有工作要做 - 但我上面描述的内容使我们更接近解决方案。