2010-08-06 100 views
7

我正在做一些图像处理,并且试图跟踪类似于以下圈出的点,这是一个非常暗的点,直径为几个像素,与所有相邻点像素点亮。我确信有为此设计的算法和方法,但我只是不知道它们是什么。我不认为边缘检测会起作用,因为我只想要小点。我已经读了一些关于形态操作符的信息,这些可能是一种合适的方法吗?如何检测与其邻居完全不同的点

感谢

wavelet filtered image

+0

你是只看明亮的背景上的黑点还是对面的(黑点背景上的亮点)? – 2010-08-29 18:48:50

回答

1

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

此外,您还可以通过利用隔离像素是这样的像素,通过其强度在每个方向剧烈变化的想法来锻炼天真的角点检测算法。这只是一个开始的想法,从更进一步的算法开始。

+0

404现在链接, 这里是角点检测的维基百科页面(我无法知道它是否包含与链接文章类似的信息):https:// en。 wikipedia.org/wiki/Corner_detection – dtudury 2015-12-01 19:39:02

5

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

当你遇到一个暗像素时,在其上执行一个flood-fill,将所有这些像素标记为“已用”,并跟踪填充了多少像素。在填充填充期间,确保像素你正在考虑的不是黑暗,它是足够光明的。

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

+0

这是一个不错的方法,我会尝试 – Simonw 2010-08-06 16:59:06

2

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

0

它已经几年了,因为我做任何图像处理。但我可能会先转换为二进制表示。它似乎并不像你对灰色中间值过度兴趣,只是非常黑暗/非常亮的区域,所以摆脱所有的灰色。在这一点上,各种形态操作可以突出你感兴趣的点。打开和关闭操作非常容易实现,并且可以产生相当不错的结果,除了感兴趣的点外,您还可以在任何地方使用黑色字段。

3

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

然后如果大多数邻居都亮的像素越亮等

编辑:经过一番思考,我意识到这将不会检测离群值,它会删除它们。所以这不是原创海报问的解决方案。

1

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

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

0

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

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