从颜色背景中检测黑点

Wan*_*ong 15 algorithm matlab opencv image-processing computer-vision

我的简短问题

如何检测以下图像中的黑点?(我只粘贴一个测试图像,使问题看起来很紧凑.可以找到更多图像→这里←).

在此输入图像描述

我的长问题

如上所示,背景颜色大致为蓝色,点颜色为"黑色".如果选择一个黑色像素并测量其RGB颜色,则该值可以是在此输入图像描述 (0,44,65)或 在此输入图像描述 (14,69,89)....因此,我们不能设置一个范围来告诉像素是黑点或背景的一部分.

我测试了10张不同颜色的图像,但我希望我能找到一种方法来检测可能由三种或更多颜色组成的更复杂背景中的黑点,只要人眼可以轻松识别黑点.可以省略一些极小或模糊的点.

之前的工作

上个月,我在stackoverflow上问了一个类似的问题,但是没有一个完美的解决方案,但是有一些很好的答案.如果您有兴趣,请详细了解我的工作.

以下是我尝试过的方法:

  1. 转换为灰度或图像的亮度.困难在于我无法找到进行二值化的自适应阈值.显然,将彩色图像转换为灰度或使用亮度(HSV)将失去许多有用的信息.计算自适应阈值的Otsu算法也不起作用.

  2. 计算RGB直方图.在我的上一个问题中,natan的方法是通过直方图估计黑色.节省时间,但自适应阈值也是一个问题.

  3. 聚类.我尝试过k-means聚类,发现它对于只有一种颜色的背景非常有效.缺点(参见我自己的答案)是我需要提前设置聚类中心的数量,但我不知道背景如何.更重要的是,它太慢了!我的应用程序是在iPhone上实时捕获,现在它可以使用k-means每秒处理7~8帧(我认为20 FPS是好的).

摘要

我认为不仅相似的颜色而且相邻的像素应该"聚集"或"合并"以便提取黑点.请指导我解决问题的正确方法.任何建议或算法将不胜感激.没有免费的午餐,但我希望在成本和准确性之间做出更好的平衡.

gno*_*ice 13

通过转换为HSV色彩空间rgb2hsv,然后使用图像处理工具箱功能imopenimregionalmin价值通道,我能够得到一些非常好的第一遍结果:

rgb = imread('6abIc.jpg');
hsv = rgb2hsv(rgb);
openimg = imopen(hsv(:, :, 3), strel('disk', 11));
mask = imregionalmin(openimg);
imshow(rgb);
hold on;
[r, c] = find(mask);
plot(c, r, 'r.');
Run Code Online (Sandbox Code Playgroud)

结果图像(问题中的图像和链接中的图像):

在此输入图像描述

在此输入图像描述

您可以看到一些误报和遗漏点,以及一些用多个点标记的点,但是一些改进(例如修改打开步骤中使用的结构元素)可以清除这些点.


bla*_*bla 7

我很古怪用图片上的旧2d峰值查找器代码进行测试,没有任何阈值或任何颜色考虑因素,你觉得真的粗糙吗?

im0=imread('Snap10.jpg');
im=(abs(255-im0));
d=rgb2gray(im);
filter=fspecial('gaussian',16,3.5);
p=FastPeakFind(d,0,filter);
imagesc(im0); hold on
plot(p(1:2:end),p(2:2:end),'r.')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我正在使用的代码是一个简单的2D局部最大值查找器,有一些误报,但总而言之,它捕获了大多数点而没有重复.我使用的滤镜是2d高斯宽度和标准,类似于典型的blob(最好的是为您的问题获得匹配的滤镜).一个更复杂的版本可以处理颜色(rgb2hsv?)可以进一步改善这一点......