Python 如何将图像按“分组”;爆发;

Python 如何将图像按“分组”;爆发;,python,image-processing,Python,Image Processing,我想这需要一点解释,所以请容忍我 我以每秒4-6次的方式拍摄了2000多张图像。它们都被扔在同一个地方,所以我需要对它们进行分类。我需要按脉冲对它们进行排序,但EXIF数据仅提供一分钟的分辨率。突发事件应该是几乎完全相同的事情,不同的突发事件被设计成显著不同的 我需要看每一张图片,将其与下面的图片进行比较,看看是否相似。如果它太不一样,它一定是来自另一个突发事件,它需要进入一个新的文件夹,以及以下任何与它相似的图像,等等 我的想法是将当前图像的每个像素与下一个像素之间的差值的绝对值相加。一旦总和

我想这需要一点解释,所以请容忍我

我以每秒4-6次的方式拍摄了2000多张图像。它们都被扔在同一个地方,所以我需要对它们进行分类。我需要按脉冲对它们进行排序,但EXIF数据仅提供一分钟的分辨率。突发事件应该是几乎完全相同的事情,不同的突发事件被设计成显著不同的

我需要看每一张图片,将其与下面的图片进行比较,看看是否相似。如果它太不一样,它一定是来自另一个突发事件,它需要进入一个新的文件夹,以及以下任何与它相似的图像,等等

我的想法是将当前图像的每个像素与下一个像素之间的差值的绝对值相加。一旦总和达到一个阈值,那就意味着它们来自不同的突发事件(我可以做一些测试来找出什么是好的阈值)

最大的问题是如何解决?PIL/枕头支持这样的东西吗?有没有更好的方法来判断一张图片是否与另一张图片“基本”相同

我对快速排序比使用任何特定技术更感兴趣,因此欢迎使用其他方法

…而且它必须是Python

编辑: 以下是一对示例图像,它们应放在同一文件夹中:

这是以下突发事件中的两个图像,应放在另一个文件夹中:

如果您想进行基于内容的匹配,而不是上面的好人建议的基于时间戳的排序,那么OpenCV库是一个不错的选择。查看这篇文章,了解如何将OpenCV库用于图像相似性匹配的不同技术:

关于同一主题有很多问题,所以通读它们会给你一个更好的想法

基于上面的时间概念,当我只绘制你的照片拍摄的时间时,我得到了一个图:

不同的颜色代表不同的文件夹(应该使用不同的颜色贴图以获得更好的可视性,但是哦…)

仅根据这些时间,集群间时间似乎比集群内时间明显更明显

我还在下面的输出中计算了一些集群内和集群间指标:

folder: ImageBurstsDataset/001
Total image files in folder: 6
Total intra-cluster time: 1.0
Average intra-cluster time: 0.166666666667
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/002
Total image files in folder: 7
Total intra-cluster time: 1.0
Average intra-cluster time: 0.142857142857
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/003
Total image files in folder: 6
Total intra-cluster time: 1.0
Average intra-cluster time: 0.166666666667
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/004
Total image files in folder: 6
Total intra-cluster time: 2.0
Average intra-cluster time: 0.333333333333
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/005
Total image files in folder: 6
Total intra-cluster time: 2.0
Average intra-cluster time: 0.333333333333
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/006
Total image files in folder: 6
Total intra-cluster time: 1.0
Average intra-cluster time: 0.166666666667
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/007
Total image files in folder: 6
Total intra-cluster time: 2.0
Average intra-cluster time: 0.333333333333
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/008
Total image files in folder: 5
Total intra-cluster time: 2.0
Average intra-cluster time: 0.4
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/009
Total image files in folder: 6
Total intra-cluster time: 1.0
Average intra-cluster time: 0.166666666667
Max: 1.0, Min: 0.0

folder: ImageBurstsDataset/010
Total image files in folder: 6
Total intra-cluster time: 2.0
Average intra-cluster time: 0.333333333333
Max: 1.0, Min: 0.0


Inter-cluster times: [10.0, 8.0, 7.0, 5.0, 6.0, 6.0, 5.0, 10.0, 6.0]
免责声明:匆忙编写此脚本,只需返回并确保所有边缘案例都是正确的。但除此之外。。。我从您上传的数据集中得出的结论是:

  • 在一个簇中,一张图片与前一张图片的间隔不会超过1秒

  • 下一簇中的第一张图片与上一簇中的最后一张图片至少相隔5秒


  • 两幅图像有多相似是一个开放的研究问题。然而,考虑到您的图像是快速拍摄的,使用绝对差异是合理的。另一种可能性是使用相关性,例如,乘以像素值并接受高于阈值的结果


    问题在于速度。根据您对准确性的要求,您可能能够对图像进行非常显著的二次采样。可能是比较100或1000个均匀分布的像素(每个图像中相同的像素)的值可以得到足够精确的统计数据。PIL可以给出图像的RGB数据,理论上可以用于图像比较。要测量两幅图像的接近程度,您可能需要计算两幅图像的差异,或者使用更多错误计算统计方法。您可以使用

    import Image
    pic  = Image.open('/path/to/file')
    rgbdata = pic.load()
    width, height = pic.size
    
    您可以仅根据RGB数据[i,j]中第i个像素的RGB值查看数据

    希望这有帮助

    [编辑] 此方法仅在假设所有图片都在同一帧中拍摄时有效。。。如果相机稍微移动一下,这就不行了

    如果它们来自三脚架上的相机(静止),并且物体在移动,那么我们甚至可以跟踪物体的移动(像素值差异较大)

    或者,人们必须像在人脸识别之类的应用程序中那样定义跟踪点。(我不是图像处理方面的专家,但很少见过这样工作的应用程序)


    比较两幅图像的另一种方法是傅里叶域。但不确定它对您的效果如何。

    抱歉,事实证明EXIF数据才是解决问题的方法。看起来两次爆发之间有10-15秒的时间间隔,所以很容易分辨出一次爆发的结束和另一次爆发的开始

    PIL/Pillow拥有足够的工具,可以使用以下工具查看创建日期:

    from PIL.ExifTags import TAGS
    
    def get_exif(fn):
        ret = {}
        i = Image.open(fn)
        info = i._getexif()
        for tag, value in info.items():
            decoded = TAGS.get(tag, tag)
            ret[decoded] = value
        return ret
    

    …或者类似的东西。

    EXIF数据中时间戳的分辨率是多少?一种简单得多的方法是根据时间戳的微小差异来识别以突发方式拍摄的图片。一个视觉相似性的方法应该得到相似的结果,不是吗?时间分辨率取决于您的相机。比较时间戳还不够吗?与实际比较照片本身相比,可能最容易看到照片是否在一个小的时间范围内拍摄。是的,这款相机提供一分钟的分辨率:-(你是对的,如果我有数据的话,那将是一个更好的选择。你能链接一张照片吗?看起来它至少应该记录秒数(时间戳应该是ISO格式,包括这个)。我会在进行视觉相似性测试之前先尝试一下,看看你能从中得到什么。乘法是我以前没有考虑过的一个选项。主要问题是如何获取数据?我对numpy数组不太在行……嗯。看起来你从不同爆发中得到的图像仍然非常相似。你可能会想但是,为了使该方法对噪声不那么敏感,您可以对差异进行柱状图分析,并在达到一定百分比(比如10-2)时声明差异