在灰度图像中找到十字的算法

时间:2016-12-01 11:05:40

标签: image algorithm

所以我有这个形象: Cross

它看起来像一个小图像,但实际上它来自具有大分辨率的相机,这意味着该图像的矩阵将具有大尺寸。 我需要做的是尽可能以最快的方式找到十字架 我试图扫描所有矩阵并找到白线的位置,但我想听听你的意见,也许你有更好更快的解决方案来解决这个问题。
请记住,此图像来自相机,因此这可能看起来像一个普通的情况,但实际上可能会发生很多事情,如不在中心的交叉,交叉移动等。 非常感谢你,祝你有个美好的一天。

- 版本 -
我很抱歉没有回答这些问题。我是学生,不幸的是我的日程安排很疯狂..我会尽力上网。
您的问题的答案是:
原始图像的完整尺寸是多少?最大图像尺寸为:宽度:1936像素,高度:1216像素。但是,由于我们为用户设计了程序,因此用户可以随意管理分辨率 您使用的操作系统是什么? Windows 7/8/10
什么语言/工具集?我用C#编写。我得到了相机的API,我需要使用这个API来计算我从相机获得的图像。
 你有GPU吗?我是这么认为的。
多核CPU?嗯..我不这么认为..
最后两个问题如何与我的问题相关?我问,因为我是新来的..


另一个问题:
+由于十字架的位置是用户定义的,因此它可以位于屏幕上的任何位置。它也可能根本无法显示,因为用户可能忘记打开相机或其他任何东西..所以基本上,任何事情都可能发生。
此外,相机本身可能破损或不完美,屏幕上可能会出现一些意外的事情,如随机白色像素或类似的东西。
+关于十字线的最小宽度 - 我实际上不知道..它来自相机,所以它基本上很轻。我取决于用户和他们使用的设备。所以我想在这种情况下最小值是1 px。
“找到十字架”的意思是: 我需要以最快的方式找到图像中的十字中心,就像测量设备一样。

现在算法正在扫描屏幕上图片给出的像素矩阵,并在每行中找到行中的最大值。
然后,计算它的位置并用它做一些数学运算。
但这一点本身就是以最快的方式获得十字中心的位置,同时保持计算的准确性。 我们不想丢失数据,因为该程序可以在非常敏感的环境中使用。
我希望我能让事情更清楚..



再次,抱歉延迟,谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

一切都取决于真实的图像质量。对于给定的示例,足以在每个线和列中找到最亮的像素,并为线构建最小二乘近似,或计算图像矩

如果存在任意对象并且存在一些噪声,可以尝试Hough变换来确定线

答案 1 :(得分:0)

图像处理在计算上很昂贵。 根据您给出的示例关注质量,您应该考虑的第一件事是对图像应用高通滤波。它会更容易找到十字架,更难以检测错误。 如果你正在寻找一个很好的参考资料,Rafael Gonzalez有一本名为“数字图像处理”的书,基本上涵盖了你需要知道的一切。

答案 2 :(得分:0)

更新了答案

关于你的CPU是多核的(并且拥有GPU)的问题是至关重要的 - 不知道是不是很好。

  • 如果你的相机需要50毫秒来获取图像而你没有处理,你可以每秒做20帧。

  • 如果花费50毫秒获取一帧然后50毫秒处理它,你现在每秒只能做10帧。

  • 但是,如果你有一个多核CPU并编写多线程代码,你可以在50ms内获得一个帧,并且在下一帧到来之前有3个其他线程/核心执行50ms的处理,突然之间你可以每帧进行150ms的额外处理,并且仍然可以保持你完成的帧速率而不进行任何处理。

以上内容也适用于您的GPU。

查看我的其他答案here底部的红色/绿色图表,以便更好地了解我对线程的看法。

此外,跨帧总结的操作类型非常适合SIMD优化,因此您需要确保将编译器设置为优化/矢量化顺序存储器访问 - 或手动编码SIMD版本。

原始答案

您可以尝试在图像上调整大小/求和到一个1像素宽的高大列。然后同样沿着图像向下一个1像素高的长条形图。然后查找相应白条的最大值(或中心值):

enter image description here

我在这里显示了10像素宽的条形图,因此您可以看到它们。