如何检测与其邻居完全不同的点

时间:2010-08-06 16:11:20

标签: c++ algorithm image image-processing opencv

我正在进行一些图像处理,并且我正在尝试跟踪类似于下面圈出的点的点,这是一个直径为几像素的非常暗点,所有相邻像素都很亮。我确信有针对此设计的算法和方法,但我只是不知道它们是什么。我不认为边缘检测会起作用,因为我只想要小点。我已经阅读了一些关于形态学运算符的内容,这些方法是否合适?

由于

wavelet filtered image

9 个答案:

答案 0 :(得分:5)

循环覆盖图片中的每个像素。当您考虑了一个像素时,将其标记为“已使用”(将其更改为某个标记值,或将此数据保存在与图像平行的单独数组中)。

当您遇到黑暗像素时,在其上执行flood-fill,将所有这些像素标记为“已使用”,并跟踪填充的像素数。在填充洪水期间,请确保如果您考虑的像素不是暗的,那就足够亮了。

洪水填充后,您将知道您填充的暗区的大小,以及填充的边框是否仅为明亮像素。现在,继续原始循环,跳过“已使用”像素。

答案 1 :(得分:3)

某种中值滤波怎么样?在像素周围采样3 * 3网格(或一些其他合适大小)的值,并将像素值设置为这9个像素的中值。

然后,如果大多数邻居都很亮,那么像素会变亮等等。

编辑:经过一番思考,我意识到这不会检测到异常值,它会删除它们。所以这不是原始海报所要求的解决方案。

答案 2 :(得分:2)

你确定你不想做类似边缘检测的方法吗?似乎将当前像素与邻域像素的平均值进行比较就可以了。 (我会评估各种社区规模。)

答案 3 :(得分:1)

我可以想到这些方法可能会对某些参数调整起作用:

答案 4 :(得分:1)

如果所有功能的大小大致相同,我实际上会为此建议简单的模板匹配。

只需复制粘贴一个(或几个要素)的像素即可创建少量模板,然后使用规范化交叉关联或OpenCV在其模板匹配例程中提供的任何其他分数来查找类似区域。在结果中,检测响应的所有最大峰值(OpenCV也具有此功能),这些是您的特征坐标。

答案 5 :(得分:1)

我个人喜欢这个corner detection algorithms手册。

你也可以通过利用孤立像素就是这样一个像素的想法来锻炼天真角落检测算法,通过这个像素强度在每个方向上都会发生剧烈变化。这只是一个开始的想法,从更好的算法开始并继续前进。

答案 6 :(得分:0)

我做了任何图像处理已经有几年了。但我可能会从转换为二进制表示开始。看起来你对灰色中间值不太感兴趣,只是非常暗/非常亮的区域,所以摆脱所有的灰色。在这一点上,各种形态操作可以突出你感兴趣的点。开启和关闭非常容易实现,并且可以产生非常好的结果,除了你感兴趣的点之外,你会留下一个黑色的领域。

答案 7 :(得分:0)

您是否尝试使用cvContours提取连接的组件?首先对图像进行阈值处理(使用Otsu的方法说),然后提取每个轮廓。由于您想要跟踪的景点(从我在图像中看到的)与邻近区域有些隔离,因此它们将作为单独的轮廓。现在,如果我们计算每个轮廓的边界矩形的面积并滤除较大的轮廓,我们将只剩下与黑暗邻居分开的小点。   如前所述,轮廓分离前的一些形态修补应该会产生良好的结果。

答案 8 :(得分:0)

模糊(3x3)您的图像副本然后衍射您的原始图像。具有最高值的像素是与它们的邻居最不同的像素。这可以用作边缘检测算法,但点就像超边缘,因此将阈值设置得更高。

what a single off pixel looks like:
(assume surrounding pixels are all 1)

original  blurred         diff
1,1,1     8/9,8/9,8/9     1/9,1/9,1/9
1,0,1     8/9,8/9,8/9     1/9,8/9,1/9
1,1,1     8/9,8/9,8/9     1/9,1/9,1/9


what an edge looks like:
(assume surrounding pixels are the same as their closest neighbor)

original  blurred         diff
1,0,0     6/9,3/9,0/9     3/9,3/9,0/9
1,0,0     6/9,3/9,0/9     3/9,3/9,0/9
1,0,0     6/9,3/9,0/9     3/9,3/9,0/9