图像聚类-层次聚类

最近做的一个东西跟这个相关,本来希望是用深度学习对于没有标签的图像数据进行分类,但是通常情况下,深度学习是对有标签的数据进行学习,目的是用来自动提取特征,代替传统的手工提取特征。因此,比较容易想到,对于无标签又需要分类的图像数据,可以尝试先采用聚类来解决.

 

下面的内容是译自Jan Erik Solem的《Programming Computer Vision with Python》的第6章,该书已经由朱文涛和袁勇学长对该书进行了翻译,主要涉及相关代码和实例,可以转至http://yongyuan.name/pcvwithpython/。我仅对其中第6章的理论进行翻译,中途穿插自己的理解。

 

该博文仅供交流学习,如有侵权,请联系删除。

===================================================================================

(接上)

现在我们开始下一个基本的聚类算法。


6.2 层次聚类(Hierarchical Clustering)

层次聚类(或者叫做凝聚聚类)是另一个简单但是强大的聚类算法。其思想是基于成对距离建立一棵相似度树。该算法首先分组成为两个最近的对象(基于特征向量之间的距离),并且在一棵有着两个对象作为孩子的树中创建一个平均结点。然后在余下的结点中找到一个最近的pair,并且也包含任何平均节点,等等。在每一个结点,两个孩子之间的距离也会被存储。簇然后可以通过遍历这棵树并在距离比某个阈值小以至于决定聚类的大小的结点处停止来被提取出来。

层次聚类有几个优势。比如,树结构可以被用来可视化关系,并且显示簇是如何关联起来的。一个好的特征向量将得到树中好的分离。另一个优势是树可以在不同的簇阈值中被重用,而不需要重新计算树。缺点是需要选择一个阈值如果实际的簇需要的话。

让我们来看看这如何实现。创建一个文件hcluster.py,将下面的代码加进去。




我们对树结点创建了两个类,ClusterNode和ClusterLeafNode分别用于创建簇树。函数hcluster()创建了树。首先一系列的叶子结点被创建,然后最近的对基于选择的距离度量被迭代地分组到一起。返回最后的结点将得到树的根节点。在一个将特征向量作为行的矩阵上面运行hcluster()可以创建和返回簇树。

距离度量的选择取决于实际的特征向量,这里我们使用欧几里得(L2)距离(对于L1距离的函数也是提供了的)但是你可以创建任意函数,并且可以将其作为参数传给hcluster(). 我们也使用了子树中的所有节点的平均特征向量作为一个新的特征向量来代表子树,并将每一棵子树看成对象。也有其他的方法来决定接下来合并哪两个节点,比如单连(Single Linking,在两棵子树的对象中使用最小距离)和全连(CompleteLinking, 在两棵子树的对象中使用最大距离)。连接的选择将影响生成的簇的类型。

为了从树中提取簇,你需要从顶层遍历树直到发现一个结点的距离值小于某个阈值。这个通过递归可以很容易实现。ClusterNode的方法extract_clusters()通过返回一个有结点本身小于距离阈值的队列,否则调用孩子结点(叶子结点总是返回自身)。调用这个函数会返回包含簇的子树队列。为了得到包含对象id的每一个簇子树的叶子结点,遍历每一个子树并使用get_cluster_elements()返回一序列的叶子。

接下来我们将它用在一个简单的例子中查看。首先创建一些2D的数据点(与上面的K均值一样)。


将点聚类,并使用某个阈值从列表中提取簇,并在控制台打印簇。


运行会得到类似下面的数据:


理想情况下,你应该得到两个簇,但是取决于实际的数据,也可能得到3个甚至更多的簇。在这个简单的聚类2D点的例子中,一个出应该包含小于100的值另一个包含100或者大于100的值。

 

图像聚类

下面我们看一个基于其颜色内容聚类图像的例子。文件sunsets.zip包含从Flickr使用标签“sunset”下载的100张图像。在这个例子中,我们将使用每张图像的一个颜色柱状图来作为特征向量。这样有一点粗糙和简单但是足够好地说明层次聚类做了什么。在包含sunset图像数据的目录下运行下面的代码。这里也可以将路径换成自己的图像数据集。


这里,我们将R,G和B颜色通道作为向量,并将他们传入NumPy的histogramdd()函数中计算多维柱状图(在这个案例中是三维)。我们在每一个颜色维度(8*8*8)中选择8箱,随后会在平展之后再特征向量中选择512箱。我们使用“normed=True”选项来归一化柱状图防止图像有不同的尺寸,并对每一个颜色通道设置范围为0…255. 一维的reshape()的使用设置为-1将自动决定正确的尺寸,因此可以创建对于计算包含RGB颜色值作为行的柱状图的输入数组。

为了可视化簇树,我们可以画一个树状图。树状图是显示树层次的图。这通常可以对一个给定的描述符有多好和在特殊情况下如何考虑相似性等问题给出有用的信息。将下面的代码加到hcluster.py中:



这里,树状图的描绘为每一个结点使用了draw()函数。将这个方法加到ClusterNode类中:


叶子结点有它们自己的特殊方法来画出实际图像的缩略图。将下面的代码加到ClusterLeafNode类中:



树状图(和它的字部分)的高度是由距离值决定的。这些需要被剪裁来适应被选择的图像分辨率。结点使用传递到下面层的坐标值迭代被画。叶子结点使用20x20像素的缩略图来画的。两个辅助函数被用来得到树的高度和宽度,get_height()和get_width()。

树状图通过下面的代码作图:


夕阳图像的聚类树状图在图5中。我们可以看到,,有相似颜色的图像在树中是很近的。图6给出了3个例子。


图5-在RGB坐标值作为特征向量使用一个512箱柱状图的100张夕阳图像的层次聚类

树中靠近彼此的图像具有相似的颜色分布。


图6-从有着层次聚类的100张夕阳图像中选出的样例聚类

使用树中最大结点距离的23%的阈值提取

这个样例中的聚类通过下面的代码被提取。


作为一个结束样例,我们可以为字体图像建立一个树状图:


其中projected和imlist分别表示的是在6.1节里K均值算法中使用的变量。结果树状图如下图7.


图7-使用40个主成分作为特征向量的66张选出来的字体图像的层次聚类

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: 在MATLAB中,要对一张彩色图像进行层次聚类,首先需要将图像加载到MATLAB中。可以使用imread函数将图像加载为一个三维矩阵,其中每个元素表示图像的像素值。 接下来,可以使用将图像从RGB颜色空间转换为Lab颜色空间。可以使用rgb2lab函数来实现这一点。在Lab颜色空间中,颜色信息和亮度信息分开表示,这有利于后续的聚类。 然后,我们可以使用kmeans函数来对Lab颜色空间中的像素进行聚类。kmeans函数需要指定聚类的数目,这决定了最终的聚类结果的多少。可以尝试不同的聚类数目,以得到最佳的聚类结果。 聚类之后,可以将每个像素分配到一个聚类中心。这样,每个像素都有一个簇标签,表示它所属的聚类。 最后,可以根据聚类的结果将像素重新映射到RGB颜色空间,以得到彩色图像。可以使用lab2rgb函数来实现这一点。该函数将Lab颜色空间中的像素值转换为RGB颜色空间中的像素值。 综上所述,要在MATLAB中对一张彩色图像进行层次聚类,可以按照上述步骤进行操作。这样就可以得到图像层次聚类结果,并将像素重新映射为彩色图像。 ### 回答2: Matlab是一种强大的编程语言和环境,可以用来进行图像处理和数据分析。在Matlab中,可以使用层次聚类算法对一张彩色图像进行聚类分析。 层次聚类是一种自底向上的聚类方法,它将相似的数据点逐步合并为更大的簇。对于彩色图像,可以使用RGB或者HSV三个通道的像素值来描述每个像素的颜色。首先,需要将图像转换为合适的颜色空间。例如,可以将图像从RGB颜色空间转换为HSV颜色空间,其中H表示色调,S表示饱和度,V表示亮度。 然后,可以使用层次聚类算法对转换后的图像进行聚类。在Matlab中,可以使用自带的函数`clusterdata`来实现层次聚类。该函数可以根据要求选择不同的距离度量和聚类方法,并返回聚类结果。 在层次聚类完成后,可以通过可视化来展示聚类结果。可以绘制不同聚类簇的颜色编码图像,或者将图像中的每个像素标记为所属簇的索引值。 总结来说,使用Matlab对一张彩色图像进行层次聚类的过程可以分为以下几个步骤:图像颜色空间的转换、选择合适的距离度量和聚类方法、调用`clusterdata`函数进行聚类、可视化聚类结果。这样可以帮助我们更好地理解图像中的颜色分布和聚类特点。 ### 回答3: MATLAB可以通过使用Image Processing Toolbox中的功能对一张彩色图像进行层次聚类处理。 首先,我们需要将彩色图像加载到MATLAB中。这可以通过使用imread函数来实现,该函数可以将图像文件读取为矩阵形式。 接下来,我们可以使用rgb2lab函数将RGB颜色空间转换为Lab颜色空间。由于Lab颜色空间与人眼感知更加相关,因此在聚类过程中使用Lab颜色空间可以提供更好的结果。 然后,我们可以使用kmeans函数执行聚类。kmeans函数是一种常用的聚类算法,它可以将数据点分为指定数量的簇。我们可以设置簇的数量为我们想要的层次聚类的数量。 在执行聚类之后,我们可以使用reshape函数将聚类结果重新构造为图像的形状。然后,我们可以使用label2rgb函数将标签映射为颜色,以生成可视化的聚类结果。 最后,我们可以使用imshow函数显示聚类结果。 综上所述,通过适当地使用MATLAB中的函数和工具箱,我们可以对一张彩色图像进行层次聚类处理,并以可视化的方式展示聚类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值