过去几年我做过的最有趣的项目之一是一个关于图像处理 https://en.wikipedia.org/wiki/Image_processing。目标是开发一个能够识别可口可乐的系统'cans'(请注意,我强调“罐头”这个词,您很快就会明白原因)。您可以看到下面的示例,其中可以识别罐头绿色矩形具有缩放和旋转功能。
项目的一些限制:
- 背景可能非常嘈杂。
- The can可以有任何scale or rotation甚至方向(在合理的范围内)。
- 图像可能有一定程度的模糊性(轮廓可能不完全笔直)。
- 图像中可能存在可口可乐瓶,算法应该只检测can!
- 图像的亮度可能会有很大变化(因此您不能“过多”依赖颜色检测)。
- The can可能部分隐藏在侧面或中间,也可能部分隐藏在瓶子后面。
- 不可能有can图像中根本没有,在这种情况下,您必须什么也找不到并写一条消息来说明这一点。
所以你最终可能会遇到这样棘手的事情(在这种情况下我的算法完全失败):
我不久前做了这个项目,做起来很有趣,而且我有一个不错的实现。以下是我的实施的一些细节:
Language:使用 C++ 完成OpenCV http://opencv.org图书馆。
预处理:对于图像预处理,即将图像转换为更原始的形式以提供给算法,我使用了两种方法:
- Changing color domain from RGB to HSV http://en.wikipedia.org/wiki/HSL_and_HSV and filtering based on "red" hue, saturation above a certain threshold to avoid orange-like colors, and filtering of low value to avoid dark tones. The end result was a binary black and white image, where all white pixels would represent the pixels that match this threshold. Obviously there is still a lot of crap in the image, but this reduces the number of dimensions you have to work with.
- 噪声过滤使用中值滤波(取所有邻居的中值像素值并用该值替换像素)来减少噪声。
- Using Canny Edge Detection Filter http://en.wikipedia.org/wiki/Canny_edge_detector to get the contours of all items after 2 precedent steps.
算法:我为此任务选择的算法本身取自this https://rads.stackoverflow.com/amzn/click/com/0123725380关于特征提取的很棒的书,被称为广义霍夫变换 http://en.wikipedia.org/wiki/Generalised_Hough_transform(与常规霍夫变换非常不同)。它基本上说了几件事:
- 您可以在不知道其解析方程的情况下描述空间中的物体(这里就是这种情况)。
- 它可以抵抗缩放和旋转等图像变形,因为它基本上会测试图像的缩放因子和旋转因子的每种组合。
- 它使用算法将“学习”的基本模型(模板)。
- 根据从模型中学到的信息,轮廓图像中剩余的每个像素将投票给另一个像素,该像素被认为是对象的中心(就重力而言)。
最后,你会得到一个投票热图,例如这里罐头轮廓的所有像素都会投票给它的重心,所以你会在与中心,并将在热图中看到一个峰值,如下所示:
一旦你有了这个,一个简单的基于阈值的启发式方法就可以给你中心像素的位置,从中你可以导出比例和旋转,然后在它周围绘制你的小矩形(最终的比例和旋转系数显然与你的原始模板)。理论上至少...
Results:现在,虽然这种方法在基本情况下有效,但在某些领域严重缺乏:
- It is 非常慢!我对这一点的强调还不够。处理这 30 张测试图像几乎需要一整天的时间,显然是因为我的旋转和平移缩放系数非常高,因为有些罐子非常小。
- 当瓶子出现在图像中时,它就完全丢失了,并且由于某种原因,几乎总是找到瓶子而不是罐子(也许是因为瓶子更大,因此有更多像素,因此更多选票)
- 模糊图像也不好,因为投票最终以像素形式出现在中心周围的随机位置,从而以非常嘈杂的热图结束。
- 实现了平移和旋转的不变性,但方向不变,这意味着未直接面向相机目标的罐子无法被识别。
你能帮助我提高我的水平吗specific算法,使用独家 OpenCV特点,解决四具体提到的问题?
我希望有些人也能从中学到一些东西,毕竟我认为不仅仅是提问的人应该学习。 :)