使用Sci-Kit对已调整大小的图像进行聚类

时间:2017-01-25 14:41:45

标签: 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)

一旦我得到了矢量,我就从中移除了白色边框并展平了矢量。

问题是视觉上非常相似的一些图像具有不同的质量(由于尺寸调整之前的尺寸)。它们不会被视为单独的集群。

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

enter image description here

enter image description here

  • 我试图在sci-kit学习中使用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

1 个答案:

答案 0 :(得分:0)

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

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

    希望这样的事情有所帮助 - 很想听听它是怎么回事。