1

我正在编写一个C++需要一点图像处理的应用程序。由于我对这个领域完全陌生,我不知道从哪里开始。

基本上我有一个图像,其中包含一个带有几个框的矩形。我想要的是能够隔离它rectangle (x, y, width, height)并获得里面每个盒子的中心坐标(总共 18 个)。

我正在考虑使用一个简单的 for 循环遍历图像中的像素,直到找到一个模式,但我想知道是否有更有效的方法。我还想看看我是否可以在不使用大型库的情况下有效地做到这一点OpenCV.

这是几个示例图像,任何帮助将不胜感激:

在此处输入图像描述

另外,有哪些好的资源可以让我了解更多关于这样的图像处理的信息。

4

2 回答 2

1

这里的检测算法可以相当简单。您的方块 (BOS) 始终与图像的边缘对齐,并且具有简单的结构。这就是我的处理方式。

  1. 选择一个色彩空间。假设 RGB 现在还可以,但在其他方面可能会更好。

  2. 对于每一行

    1. 对于每个像素,计算该像素与其正下方的像素之间的幅度差。幅度差异只是 sqrt((Xx)^2+(Yy)^2+(Zz)^2)),其中 X,Y,Z 是第一个像素的颜色坐标,x,y,z 是颜色坐标它下面的像素。对于 RGB,当然 XYZ=RGB。

    2. 计算低于某个阈值magThresh的连续差异幅度的最大运行长度。您也可以选择一个宽容的版本:最大运行长度,但允许长达 intrLen 像素的入侵,之后必须跟随长达contLen像素的长时间运行。这是为了处理正方形边缘可能存在的线间差异。

  3. 找到最大运行长度高于minWidth和低于maxWidth的最大连续行集。

这样你就找到了包含盒子的行,通过重新计算上面2.1中的数据,你会知道盒子在水平坐标中的位置。

检测框边缘是通过重复相同的操作但在框内从左到右扫描来完成的。此时,您将拥有近似的框形心,不会注意到像素之间的出血。

我认为,这可以通过通过各种卷积核重复运行图像然后进行阈值处理来完成。好消息是这两个操作都有非常快的库实现。您不想手动重新实现它们,它可能会明显变慢。

于 2012-06-07T22:18:24.600 回答
0

如果你坚持自己做(我个人会使用OpenCV,它是工业级的并且免费的),你首先需要一个边缘检测算法。互联网上有很多,但要为一些可怕的数学做好准备......

许多涉及迭代每个像素,并将其及其邻居的值提升到矩阵中,然后与内核矩阵进行卷积。请注意,必须对每个像素(但原则上,在您的情况下,您可以在第一个发现的矩形处停止)和每个颜色通道执行此操作 - 因此强烈建议将其推送到 GPU 上。

于 2012-06-07T10:03:35.707 回答