【问题标题】:Clustering Resized Images with Sci-Kit使用 Sci-Kit 对调整大小的图像进行聚类
【发布时间】:2017-01-25 22:50:21
【问题描述】:

我有几张不同尺寸的产品图片,我正在 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

【问题讨论】:

  • 聚类是一个非凸优化问题,因此只能保证收敛到一些局部最优解。也许集群在这里只是错误的方法。考虑使用感知散列等替代方案。
  • 谢谢,我试试看。

标签: python image scipy scikit-learn


【解决方案1】:

您的聚类发现不同聚类的主要原因是您正在对原始像素进行聚类,而不是对像素中的特征进行聚类。即使在视觉上看起来相似,像素也有很大的可变性。所以我认为你有两种方法:

  1. 减少像素的可变性。执行此操作的一些方法包括:在将每个图像传递给聚类算法之前稍微模糊每个图像(使用相对较小的内核,可能是 3x3 或 5x5)。或者或另外,您可以将图像转换为 HSV 颜色空间并仅使用 H 通道进行聚类。
  2. 基于图像特征而非像素的聚类。您可以尝试 scikit-image 中的 Brief 或 ORB 功能:http://scikit-image.org/docs/dev/api/skimage.feature.html

希望这样的事情有所帮助 - 很想听听进展如何。

【讨论】:

  • 谢谢,我会试一试,然后循环回到这篇文章。
猜你喜欢
  • 2015-03-06
  • 2013-10-20
  • 2014-02-24
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2017-10-16
相关资源
最近更新 更多