Python 使用Sci工具包对调整大小的图像进行聚类

Python 使用Sci工具包对调整大小的图像进行聚类,python,image,scipy,scikit-learn,Python,Image,Scipy,Scikit Learn,我有几个不同大小的产品图片,我正在sci kit中运行聚类算法,学习将相似的图片分组在一起。图像大小不同,但通常在500x500左右,我将它们缩小到250x250 def read_img(path, mode='L', size_one=(250, 250)): return misc.imresize(misc.imread(path, mode=mode), size_one) 一旦我得到了向量,我就从中移除白色边框并展平向量 问题是,一些视觉上非常相似的图像具有不同的质量(由于

我有几个不同大小的产品图片,我正在sci kit中运行聚类算法,学习将相似的图片分组在一起。图像大小不同,但通常在500x500左右,我将它们缩小到250x250

def read_img(path, mode='L', size_one=(250, 250)):
    return misc.imresize(misc.imread(path, mode=mode), size_one)
一旦我得到了向量,我就从中移除白色边框并展平向量

问题是,一些视觉上非常相似的图像具有不同的质量(由于调整大小之前的大小)。它们不会作为单独的簇被拾取

例如,这两个图像虽然非常相似,但质量稍有不同,不能聚集在一起

  • 我尝试在sci kit learn中使用AffinityPropagation和Kmeans集群的参数,但仍然没有帮助
  • 这两个向量之间也有很大的差异
从预聚类的角度来看,我可以做些什么来改进这一点?我才刚刚开始,任何反馈都会很有帮助

提前谢谢

编辑:以下是我如何调整边界,一个更好的方法也会受到欢迎

def trim_img_border(img):
    shape = img.shape
    temp_rows = []
    for row in img:
        if check_row(row):
            temp_rows.append(row)
    temp_rows_T = np.transpose(np.array(temp_rows))
    out = []
    for row in temp_rows_T:
        if check_row(row):
            out.append(row)
    return round_img(misc.imresize(np.transpose(np.array(out)), shape))


def check_row(row):
    srow = sorted(list(set(row)))
    if srow == [255] or srow == [254, 255] or srow == [253, 254, 255]:
        return False
    return True

集群查找不同集群的主要原因是,您是在原始像素上进行集群,而不是在像素的特征上进行集群。即使在视觉上,事物看起来很相似,像素也有很多变化。所以我认为你有两种方法:

  • 减少像素的变化。有几种方法可以做到这一点,包括:在将图像传递给聚类算法之前,对每个图像(使用相对较小的内核,可能是3x3或5x5)稍微模糊。或者,或者另外,您可以将图像转换为HSV颜色空间,并仅使用H通道进行聚类
  • 基于图像特征而不是像素进行聚类。您可以尝试scikit图像中的简短或ORB功能:

  • 希望像这样的东西能有所帮助-很想听听它是怎么回事。

    聚类是一个非凸优化问题,因此只能保证收敛到某个局部最优解。也许集群只是一种错误的方法。考虑像哈希和Co.这样的选择,谢谢,让我试试。谢谢,我会试试看,然后循环回这个帖子。