Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对一组图像进行聚类_Python_Opencv_Dbscan - Fatal编程技术网

Python 对一组图像进行聚类

Python 对一组图像进行聚类,python,opencv,dbscan,Python,Opencv,Dbscan,我有一个文件夹,里面有成百上千张图片,其中有些看起来很像。我想创建一个集群来分隔这些图像(在同一集群中看起来很相似的图像) 我无法确定需要的集群数量,这取决于图像。 有人知道如何使用Python、OpenCV以及使用哪种算法来实现这一点吗 我做了一些研究,发现AffinityPropagation或DBS可能对我有用,但我不知道从哪里开始(如何编码我的图像,我应该将什么传递给那些算法等等)不幸的是,对于图像来说,这并不是那么简单,因为单纯的聚类会导致具有相同颜色的图像簇,而不是相同颜色的图像簇“

我有一个文件夹,里面有成百上千张图片,其中有些看起来很像。我想创建一个集群来分隔这些图像(在同一集群中看起来很相似的图像)

我无法确定需要的集群数量,这取决于图像。 有人知道如何使用Python、OpenCV以及使用哪种算法来实现这一点吗


我做了一些研究,发现AffinityPropagation或DBS可能对我有用,但我不知道从哪里开始(如何编码我的图像,我应该将什么传递给那些算法等等)

不幸的是,对于图像来说,这并不是那么简单,因为单纯的聚类会导致具有相同颜色的图像簇,而不是相同颜色的图像簇“内容”。您可以使用神经网络作为图像的特征提取器,我看到两个选项:

  • 使用预先训练的网络,从中间层获取特征
  • 在数据集上训练自动编码器,并使用潜在功能
  • 选项1更便宜,因为您可以轻松找到预先训练的模型,选项2的计算成本更高,但应能更好地工作,尤其是在您的领域中没有预先训练的模型的情况下


    (在互联网上随机找到)似乎是对方法2的一个很好的介绍。

    不幸的是,对于图像来说,这并不是那么简单,因为单纯的聚类会导致具有相同颜色的图像聚类,而不是相同的“内容”。你可以使用神经网络作为图像的特征提取器,我看到两个选项:

  • 使用预先训练的网络,从中间层获取特征
  • 在数据集上训练自动编码器,并使用潜在功能
  • 选项1更便宜,因为您可以轻松找到预先训练的模型,选项2的计算成本更高,但应能更好地工作,尤其是在您的领域中没有预先训练的模型的情况下


    (在互联网上随机找到)这似乎是对方法2的一个很好的介绍。

    谢谢你的回答!事实上,检测两幅图像是否具有相同的颜色对我来说可能很有用。我没有很好地解释,但假设我有一个视频,我每秒提取一幅图像。我肯定会在几秒钟内看到同一个人/对象的图像,我想确定这些图像Eimages@MounaBenChamekh你当然可以尝试直接在像素上进行聚类!另一个想法是,如果你知道图像是在一个序列中(例如在视频中):您可以计算相邻图像之间的距离,如果它们比x更接近,则表示它们位于同一簇中。不幸的是,无论您选择何种方法,您都需要执行大量实验以获得正确的参数。直接在像素上进行簇集是否有效?因为即使图像看起来相似,对象也会发生变化改变位置,颜色不完全相同…如何考虑所有这些?@MounaBenChamekh的想法是视频中的相邻帧应该非常相似。但不,我不认为像素聚类会很好地工作,最可靠的自动编码器压缩信息,但你不能真的用它们来定义相似性。如果你如果你使用神经网络,那么你需要的是一个嵌入方案(当事情在某些度量方面相似时,它会在欧几里德空间中投影)。谢谢你的回答!事实上,检测两张图像是否具有相同的颜色对我来说可能很有用。我没有很好地解释,但假设我有一个视频,我每秒提取一张图像。我肯定会有几秒钟具有相同的人/对象的图像,我想识别这些图像images@MounaBenChamekh你绝对可以y直接在像素上聚类!另一个想法,如果你知道图像是在一个序列中(例如在视频中):您可以计算相邻图像之间的距离,如果它们比x更接近,则表示它们位于同一簇中。不幸的是,无论您选择何种方法,您都需要执行大量实验以获得正确的参数。直接在像素上进行簇集是否有效?因为即使图像看起来相似,对象也会发生变化改变位置,颜色不完全相同…如何考虑所有这些?@MounaBenChamekh的想法是视频中的相邻帧应该非常相似。但不,我不认为像素聚类会很好地工作,最可靠的自动编码器压缩信息,但你不能真的用它们来定义相似性。如果你如果你使用神经网络,那么你需要的是一个嵌入方案(当事情在某些度量方面相似时,它会在欧几里德空间中投影)。一个值得尝试的简单解决方案是PCA/Eigenfaces。Eigenfaces是一种设计用于压缩个人资料图像的方法,但也定义了一个相似性度量,您可以根据该度量定义集群。我不确定它是否会起作用,但本主题中有一系列教程,而且在较新的OpenCV版本中也可以开箱即用,因此它是有效的h一个镜头。此外,无论你使用何种方式,你几乎肯定必须想出一种方法来将初始数据投影到相同的空间维度。最简单的解决方案:将所有内容的样本减少到最小图像大小。一个值得尝试的简单解决方案是PCA/特征脸。特征脸是一种设计用于压缩轮廓图像的方法,但也定义了相似性可以定义集群的度量标准。我不确定它是否有效,但本主题中有一系列教程,在较新的OpenCV版本中也有现成的教程,因此值得一试。此外,无论您使用哪种方法,您几乎肯定要想办法将初始数据投影到相同的空间维度。Easiest解决方案:将所有内容的采样降至最小图像大小。