资源下载地址:https://download.csdn.net/download/sheziqiong/85909280
资源下载地址:https://download.csdn.net/download/sheziqiong/85909280
k-means 算法,也被称为 k-均值,是一种得到最广泛使用的聚类算法。其认为两个目标的距离越近,相似度越大。算法的主要思想是通过迭代来把数据划分为不同的类别,使得评价聚类性能的准则函数达到最优,从而使生成的每个聚类内紧凑,类间独立。
预解决问题:编写代码,使用 k-means 聚类对像素进行分组,将图像分割成区域。使用两种不同的特征空间(颜色和纹理)并尝试一些实验来观察它们带来的影响。编写四个附加函数:function [labelIm] = quantizeFeats(featIm, meanFeats)
function [textons] = createTextons(imStack, bank, k)
function [featIm] = extractTextonHists(origIm, bank, textons, winSize)
function [colorLabelIm, textureLabelIm] = compareSegmentations(origIm, bank, textons, winSize, numColorRegions, numTextureRegions)
同时编写一个脚本文件segmentMain.m调用上述函数,对给出的示例图片,改变不同的参数k、winSize、不同的filter bank等观察参数对结果的影响。
首先是四个附加函数的设计:
函数功能:给定 hwd 维度的矩阵 featIm,其中 h 和 w 为原始图像的高度和宽度,d 表示图像中每一个像素点所提取的特征向量的维数。给定有 k 个聚类中心点的维度为 kd 的矩阵 meanFeats。函数的返回值定义为维度为 hw 的整数矩阵 labelIm,其表示 featIm 矩阵中每一个像素所属的聚类中心标号(1…k)。
设计方法:遍历 featIm 矩阵每一个像素点,找到与 meanFeats 矩阵中 k 个聚类点最小的欧式距离作为其聚类划分。
源程序:名为 quantizeFeats.m,见文件
函数功能:imStack 是长度为 n 且包含 n 个灰度值图像的元胞数组,filter bank 是一过滤器组,其包含 d 个滤波器,每个滤波器的大小为 mm,故 bank 维度为 mmd,textons 是一个 kd 的矩阵,每一行都代表一个纹理特征,如一个量化滤波器组的响应。
设计方法:滤波器组从给定的“filterBank.mat”中获得,维度是 494938。即 38 个滤波器。元胞数组 imStack 通过滤波器后得到过滤后的样本响应,之后用 kmeans 方法对样本进行聚类,得到含有 k 个纹理基元的纹理编码集。
源程序:名为 createTextons.m,见文件
函数功能:给定灰度图像 origIm,滤波器组 bank,纹理编码集 textons(这些都是上述函数构建好的)。对于每个像素,根据其到纹理的距离进行匹配。按每个纹理在大小为 winSize 的局部窗口内出现的频率构建纹理柱状图。
设计方法:原始灰度图像 origIm 通过滤波器组进行过滤,得到 rc38 的矩阵,之后利用 dist2 函数计算每个像素点到纹理基元编码集的距离,得到矩阵 temptexton。之后统计 winSize 窗口内纹理出现的频率,做出直方图
源程序:名为 extractTextonHists.m,见文件
函数功能:从颜色特征和纹理特征两个角度对图像进行 k-means 分割得到结果。其中:colorLabelIm 和 textureLabelIm 是 h*w 的矩阵,分别表示基于颜色和基于纹理的分割区域的标签。numColorRegion 和 numTextRegions 表示两种特征类型期望的理想分割数目。
设计方法:对颜色特征,使用 kmeans 将 origIm 分为 numColorRegions 类作为初始化,之后调用 quantizeFeats 函数对其进行聚类。对纹理特征,首先使用 extractTextonHists 函数获取纹理柱状图,用 kmeans 将纹理特征划分 numTextRegions 类,之后调用 quantizeFeats 函数进行聚类。
源程序:名为 compareSegmentations.m,见文件
然后是脚本 segmentMain.m 的设计:
脚本功能:调用之前的函数,对给出的示例图片,改变不同的参数 k、winSize、不同的 filter bank 等观察参数对结果的影响。
设计方法:按顺序依次调用函数,对结果进行分析即可。注意图片特征和纹理特征两者的对比。
源程序:名为 segmentMain.m,见文件
使用 displayFilterBank 函数观察从“filterBank.mat”中 load 的滤波器组,进行可视化,结果如图 1:
图 1 38 个滤波器
可以看到前 18 个是高斯滤波器一阶导数,后 18 个是高斯滤波器二阶导数(六个方向,三个大小)。最后两个依次是 isotropic 高斯和 LoG 滤波器。
选取“gumballs.jpg”为例:
winSize = 10,numTextureRegions = 5,纹理基元 k = 10 保持不变。
numColorRegions 分别为 2、7、20、512 时的分割结果如图 2,3,4,5 所示。
图 2 理想颜色区域为 2
图 3 理想颜色区域为 7
图 4 理想颜色区域为 20
图 5 理想颜色区域为 512
可以看出颜色空间中,过多或者过少的聚类区域划分对结果有不同的影响。过多或者过少都不适合,这几个参数中 numColorRegions 选 7 或者 20 比较合适。
仍然选取“gumballs.jpg”为例:
winSize = 10,numColorRegions = 3,纹理基元 k = 10 保持不变。
numColorRegions 分别为 2、7、20、512 时的分割结果如图 6,7,8,9 所示。
图 6 理想纹理区域为 2
图 7 理想纹理区域为 7
图 8 理想纹理区域为 20
图 9 理想纹理区域为 512
与颜色空间相同,理想的纹理区域需要自己选取,上例子中,区域选为 7 比较合适。
k 为纹理编码集个数。仍然选取“gumballs.jpg”为例:
winSize = 10,numColorRegions = 7,numTextureRegions = 7,保持不变。
k 分别为 2、10、20、100 时的分割结果如图 10,11,12,13 所示。
图 10 k 值为 2
图 11 k 值为 10
图 12 k 值为 20
图 13 k 值为 100
K 决定了纹理基元的个数,如果 k 小于理想的纹理单元划分区域个数,那么会像图 10,numTextureRegions 不起作用,纹理划分个数变为 k 值。
winSize 为每个纹理邻近区域窗口的范围。仍然选取“gumballs.jpg”为例:
k = 10,numColorRegions = 7,numTextureRegions = 7,保持不变。
winSize 分别为 2、10、20、100 时的分割结果如图 14,15,16,17 所示。
图 14 winSize 值为 2
图 15 winSize 值为 10
图 16 winSize 值为 20
图 17 winSize 值为 100
纹理分割中根据像素 winSize 范围内的纹理绘制了直方图,所以 winSize 为 100 时,范围比较宽,小区域比较大。winSize 在 20 时也比 10 的时候结果更宽泛。(单个区域变大)。但是其对颜色分割没有影响。
之前的图 1 对滤波器进行了可视化,这里再次放出结果图片。
可以看到滤波器组是按大小、方向和类型组织的。
下面对只用一阶导数高斯滤波器,二阶导数高斯滤波器和 isotropic 高斯和 LoG 滤波器进行结果展示:
选取“gumballs.jpg”为例:
winSize = 10,numColorRegions = 7,numTextureRegions = 7,k=10 保持不变。
结果如图 18、19、20、21 所示。
图 18 只用一阶导数高斯
图 19 只用二阶导数高斯
图 20 只用 isotropic 高斯
图 21 只用 LoG
K-means 每次初始化中心点不同,相同参数下的运行也有不同结果。
选取“gumballs.jpg”为例:
winSize = 10,numColorRegions = 2,numTextureRegions = 2,k=10 保持不变。
分别运行 3 次,结果如图 22、23、24 所示。
图 22 第一次运行
图 23 第二次运行
图 24 第三次运行
对于测试图片,“snake.jpg”、”twins.jpg”、”planets.jpg”、”coins.jpg”,只选取比较好的参数结果进行展示。结果如图 25、26、27、28 所示。
图 25 测试图片结果
图 26 测试图片结果
图 27 测试图片结果
图 28 测试图片结果
资源下载地址:https://download.csdn.net/download/sheziqiong/85909280
资源下载地址:https://download.csdn.net/download/sheziqiong/85909280