图像中物体计数算法

5

我又得到了学校任务。这次,我的老师让我创建一个算法来计算图片上有多少只鸭子。

这张图片类似于这样:

我认为我应该使用模式识别来搜索其中有多少只鸭子。但是我不知道哪种模式匹配每一只鸭子。


3
你的老师应该在课上告诉你如何完成这个任务。如果你一无所知,那么你可能应该更加注意了!如果你有具体的编程问题,请编辑问题以便提出问题。否则,也许你应该问问你的老师。 - Polynomial
老师没有给出任何线索,我必须自己找出答案。我认为我应该使用模式识别,但是我不知道图像的哪个部分可以成为每只鸭子的模式。我不需要源代码,只需要算法或伪代码。 - justmyfreak
4
http://www.DuckOverflow.com/ - Cody Gray
1
坦白说,这看起来不像是一份作业任务,我认为它太复杂了。 - Andrey Rubshtein
这是一项非常有趣的家庭作业,虽然我同意它很复杂! - Alceu Costa
边缘检测,查找大致上倒U形曲线的所有局部极大值,并验证峰值下方的颜色是否为黄色(而不是红色),将挑选出它们头部的所有顶点并忽略喙和眼睛。 - Liudvikas Bukys
3个回答

6
我认为您可以通过将鸭子的嘴裂成段并计算二进制图像中连接组件的数量来解决此问题。
要分割鸭嘴,首先将图像转换为HSV颜色空间,然后使用色调分量进行二值化处理。请注意,鸭嘴的色调与图像的其他部分不同。

我认为这可能与我的SIFT想法有相同的问题 - 那么反面朝向的鸭子怎么办?没有喙 :/ - penelope
没错。使用这种方法,你只能得到一个大概的数字。 - Alceu Costa
1
我猜想对于这个问题来说,找到一个准确的方法非常困难,如果不是不可能的话。你的方法有一个优势,它比SIFT更容易实现,同时提供同样好的近似解 :) - penelope

2

可能是因为我现在正在使用SIFT,但在我的看法中,它对您的问题应该很有用。

它是一种算法,可以将两张不同方向、比例和视角的图片上相同的对象进行匹配。它还可以在对象被其他对象部分遮挡时(例如你的小黄鸭)进行工作。

我建议您找一张清晰的小黄鸭图片,然后使用一些SIFT实现(如VLFeat - C库带有SIFT但没有可视化SIFT++-基于VLFeat,但使用C++Rob Hess使用OpenCV的C代码...)。

请记住,使用SIFT(或任何其他方法)进行匹配不是完美的,因此您可能无法在图片中获得确切的小黄鸭数量。


你好,感谢你的回答。但是我认为如果使用SIFT算法,我的图像将很难被检测到。因为其中有一只鸭子的脸朝后。 - justmyfreak
嗯,那是真的...但由于SIFT在一定程度上对透视变化具有不变性,因此可能只需要使用几张(2-3张)学习图片(向前、向后的鸭子,也许从侧面),就足以应对。而且,正如我已经提到的,不存在一种通用和完美的方法,可以识别任何位置/方向的任何物体。 - penelope
首先,您可以使用SIFT来识别前向和侧向的鸭子,然后将这些区域涂黑(用255或其他颜色填充其边界框)。接下来,使用SIFT来获取背向的鸭子,基本上就是能够识别黄色球形物体。答案中给出的链接很棒,这里再提供一个(使用OpenCV):http://www.aishack.in/2010/07/implementing-sift-in-opencv/ - AruniRC

2
这里是一种方法:
圆的霍夫变换:
- 初始化一个由(x,y,半径)索引的累加器数组 - 对于每个像素: - 计算边缘(例如,Sobel运算符将提供幅度和方向),如果幅度超过某个阈值,则: - 增加每个累加器,该边缘可能会提供证据(仅在边缘方向上的(x,y),仅在min_duck_radius和max_duck_radius之间的半径) - 现在平滑并阈值化累加器数组,并且最高累加器的坐标显示出头部的位置。 如果您在累加器中的值的直方图中绘制图表,则阈值可能会跃出来(“大量证据”和“噪声”之间可能存在明显差异)。
因此,这很简洁,但可以让您开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接