2012-03-10 41 views
1

我有数百万的图像包含每一天的照片。我试图找到一种方法来挑选某些颜色存在的部分,比如说红色和橙色,不管形状或物体。尺寸可能很重要 - 例如至少50x50像素。Python中的图像点检测

是否有一个高效的轻量级库来实现这个功能?我知道有OpenCV,它看起来非常强大,但是对于这项任务来说它会太臃肿吗?这是一个相对简单的任务,对吧?

感谢

回答

1

我不知道是否有一个库,但你可以使用部分简单的阈值分割算法,这些领域。说,你想找到红点。从图像中提取红色通道,选择阈值,并消除低于阈值的像素。由此产生的像素是你的位置。要找到合适的阈值,您可以构建图像的红色通道直方图并在那里找到山谷。山谷中的最低点是您可以使用的阈值。如果有多个山谷,请平滑直方图,直到有一个山谷和两个山峰。您可以使用高斯函数来平滑柱状图。要从其余像素中找到斑点,您可以使用标注算法,然后在标签算法生成的图形中查找连通的组件。是的,这很简单。 :)

2

当然OpenCV可以做到这一点,但你也可以使用Python图像库PIL,只是创建一个函数来遍历图像裁剪小块的图像设置在你的最小尺寸,并测试这些块的平均颜色并根据匹配标准进行宽容。沿(未经测试的伪代码)线的东西:

import Image 

im = Image.open("test_picture.png") 
for y in xrange(image_height - block_height): 
    for x in xrange(image_width - block_width): 
     block = im.crop(x, y, x + block_width, y + block_height) 
     if colour_test(block): # test for match 
      return True 

它很容易得到使用block.getcolors()图像的色彩频率信息,让您可以轻松编写colour_test()功能。

+3

作为OpenCV和PIL的替代品,有[Mahotas软件包](http://luispedro.org/software/mahotas)。我是计算机视觉方面的实践者,我个人很不喜欢PIL,scikits.image和OpenCV,虽然每个人都有某些特定的东西。 Mahotas完全基于scipy.ndimage数据类型,这在很多情况下都很方便。我发现的唯一问题是,在处理PNG图像时,有时需要额外的库[PyPNG](http://code.google.com/p/pypng/)。 – ely 2012-03-11 01:09:43

+0

@EMS:你为什么需要PyPNG?有没有正确打开mahotas的PNG?我刚刚改变了mahotas处理PNG的方式(自从昨天发布版本以来,它使用imread软件包)。如果有图像效果不佳,请通过示例给我发电子邮件。 Tx – luispedro 2012-03-15 14:45:12

+1

@EMS:我写了mahotas,顺便说一句 – luispedro 2012-03-15 14:46:48