我很难理解scipy.cluster.vq
的真正作用!!
在Wikipedia上,它说Clustering
可用于将数字图像划分为不同的区域,以进行边界检测或物体识别。
在其他网站和书籍上,它说我们可以使用clustering
方法对图像进行聚类以查找相似图像的组。
因为我对图像处理感兴趣,所以我真的需要充分了解clustering
是什么。
所以
谁能给我展示有关将scipy.cluster.vq
与图像一起使用的简单示例?
最佳答案
scipy.cluster.vq
进行的聚类肯定是后者(相似图像组)的一种。scipy.cluster.vq
算法中唯一实现的聚类算法是K-Means算法,该算法通常将输入数据视为n维欧几里德空间中的点,并尝试对该空间进行划分,以便可以通过说出“ example x最像质心y”。质心可以视为输入数据的典型示例。矢量量化导致简洁或压缩的表示形式,因为我们可以记住一个指向新图像最像的原型示例的整数,而不是记住我们看到的每个新图像的所有100个像素。
如果您有许多小的灰度图像:
>>> import numpy as np
>>> images = np.random.random_sample((100,10,10))
因此,我们有100张10x10像素的图像。假设它们已经具有相似的亮度和对比度。 scipy kmeans实现期望平面向量:
>>> images = images.reshape((100,100))
>>> images.shape
(100,100)
现在,让我们训练K-Means算法,以便可以将任何新的传入图像分配给10个群集之一:
>>> from scipy.cluster.vq import kmeans, vq
>>> codebook,distortion = kmeans(images,10)
最后,假设我们有五个新图像要分配给十个群集之一:
>>> newimages = np.random.random_samples((5,10,10))
>>> clusters = vq(newimages.reshape((5,100)),codebook)
clusters
将包含五个示例中每个示例的最佳匹配质心的整数索引。这只是一个玩具示例,除非您正在处理的图像中的所有关注对象都居中,否则不会产生很好的结果。由于感兴趣的对象可能会出现在较大图像中的任何位置,因此通常需要学习较小图像“补丁”的质心,然后将它们与较大图像进行卷积(在许多不同位置进行比较),以促进平移不变性。