我的简短问题
如何检测以下图像中的黑点?(我只粘贴了一个测试图像,以使问题看起来紧凑。更多图像可以在→这里←找到)。
我的长问题
如上所示,背景颜色大致为蓝色,点的颜色为“黑色”。如果选择一个黑色像素并测量其RGB颜色,则该值可以是(0,44,65)或(14,69,89)......因此,我们无法设置范围来判断像素是黑点还是背景。
我测试了10个不同颜色的图像,但我希望我可以找到一种方法来检测黑点,即使背景可能由三种或更多颜色组成,只要人眼可以轻松识别黑点。有些非常小或模糊的点可以被忽略。
以前的工作
上个月,我在stackoverflow上提出了类似的问题,但没有得到完美的解决方案,虽然有一些优秀的答案。如果您感兴趣,可以找到有关我的工作的更多详细信息。
这是我尝试过的方法:
将图像转换为灰度或亮度。难点在于找不到自适应的阈值进行二值化。显然,将彩色图像转换为灰度或使用亮度 (HSV) 将会失去很多有用信息。 大津算法 计算自适应阈值也无法解决这个问题。
计算 RGB 直方图。在我的上一个问题中,natan 的方法是通过直方图估计黑色颜色。这样做可以节省时间,但自适应阈值还是一个问题。
聚类。我尝试了K-Means 聚类 并发现它对只有一种颜色的背景非常有效。缺点是我需要预先设定聚类中心的数量,但我不知道背景会是什么样子。而且速度太慢!我的应用程序是在 iPhone 上进行实时捕捉,现在可以使用 k-means 处理 7~8 帧每秒(我认为 20 FPS 是不错的)。
总结
我认为不仅应该聚类相似的颜色,还应该聚类或合并相邻像素以提取黑点。请指导我解决这个问题的正确方法。任何建议或算法都将受到赞赏。没有免费的午餐,但我希望在成本和精度之间取得更好的平衡。