【发布时间】:2014-07-22 20:19:13
【问题描述】:
我的简短问题
如何检测以下图像中的黑点? (我只贴了一张测试图,让问题看起来紧凑。更多图片可以找到→here←)。
我的长问题
如上图,背景色大致为蓝色,圆点颜色为“黑色”。如果选择一个黑色像素并测量它的RGB颜色,值可以是 (0, 44, 65) 或 (14, 69, 89)....因此,我们不能设置一个范围来告诉像素是黑点或背景的一部分。
我测试了10张不同颜色的图像,但我希望我能找到一种方法来检测可能由三种或更多颜色组成的更复杂背景中的黑点,只要人眼可以轻松识别黑点.一些极小或模糊的点可以省略。
以前的工作
上个月,我在 stackoverflow 上问过a similar question,但还没有得到完美的解决方案,不过有一些很好的答案。如果您有兴趣,请查找有关我的工作的更多详细信息。
以下是我尝试过的方法:
转换为灰度或图像的亮度。 困难在于我找不到自适应阈值来进行二值化。显然,将彩色图像转换为灰度或使用亮度 (HSV) 会丢失很多有用的信息。计算自适应阈值的Otsu algorithm也不起作用。
计算 RGB 直方图。在我的最后一个问题中,natan的方法是通过直方图来估计黑色。省时,但自适应阈值也是个问题。
集群。我试过k-means clustering,发现它对于只有一种颜色的背景非常有效。不足(见我自己的回答)是我需要提前设置聚类中心的数量但我不知道背景会如何。更何况太慢了!我的应用程序用于在 iPhone 上进行实时捕捉,现在它可以使用 k-means 每秒处理 7~8 帧(我认为 20 FPS 很好)。
总结
我认为不仅相似的颜色而且相邻的像素都应该“聚集”或“合并”以提取黑点。请指导我一个正确的方法来解决我的问题。任何建议或算法将不胜感激。没有免费的午餐,但我希望在成本和准确性之间做出更好的权衡。
【问题讨论】:
-
正如答案中所建议的,这就像找到局部最大值。我想评论颜色不变性:试试homomorphic filtering。
标签: algorithm matlab opencv image-processing computer-vision