• 基于MATLAB和k-means算法实现的图像分割


    资源下载地址:https://download.csdn.net/download/sheziqiong/85909280
    资源下载地址:https://download.csdn.net/download/sheziqiong/85909280

    K-means 实现图像分割

    一、引言

    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等观察参数对结果的影响。
    
    • 1

    二、所设计实验方案

    首先是四个附加函数的设计:

    1. function [labelIm] = quantizeFeats(featIm, meanFeats)

    函数功能:给定 hwd 维度的矩阵 featIm,其中 h 和 w 为原始图像的高度和宽度,d 表示图像中每一个像素点所提取的特征向量的维数。给定有 k 个聚类中心点的维度为 kd 的矩阵 meanFeats。函数的返回值定义为维度为 hw 的整数矩阵 labelIm,其表示 featIm 矩阵中每一个像素所属的聚类中心标号(1…k)。

    设计方法:遍历 featIm 矩阵每一个像素点,找到与 meanFeats 矩阵中 k 个聚类点最小的欧式距离作为其聚类划分。

    源程序:名为 quantizeFeats.m,见文件

    2. function [textons] = createTextons(imStack, bank, k)

    函数功能:imStack 是长度为 n 且包含 n 个灰度值图像的元胞数组,filter bank 是一过滤器组,其包含 d 个滤波器,每个滤波器的大小为 mm,故 bank 维度为 mmd,textons 是一个 kd 的矩阵,每一行都代表一个纹理特征,如一个量化滤波器组的响应。

    设计方法:滤波器组从给定的“filterBank.mat”中获得,维度是 494938。即 38 个滤波器。元胞数组 imStack 通过滤波器后得到过滤后的样本响应,之后用 kmeans 方法对样本进行聚类,得到含有 k 个纹理基元的纹理编码集。

    源程序:名为 createTextons.m,见文件

    3. function [featIm] = extractTextonHists(origIm, bank, textons, winSize)

    函数功能:给定灰度图像 origIm,滤波器组 bank,纹理编码集 textons(这些都是上述函数构建好的)。对于每个像素,根据其到纹理的距离进行匹配。按每个纹理在大小为 winSize 的局部窗口内出现的频率构建纹理柱状图。

    设计方法:原始灰度图像 origIm 通过滤波器组进行过滤,得到 rc38 的矩阵,之后利用 dist2 函数计算每个像素点到纹理基元编码集的距离,得到矩阵 temptexton。之后统计 winSize 窗口内纹理出现的频率,做出直方图

    源程序:名为 extractTextonHists.m,见文件

    4. function [colorLabelIm, textureLabelIm] = compareSegmentations(origIm, bank, textons, winSize, numColorRegions, numTextureRegions)

    函数功能:从颜色特征和纹理特征两个角度对图像进行 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,见文件

    三、实验结果与分析

    1. 观察 38 个滤波器

    使用 displayFilterBank 函数观察从“filterBank.mat”中 load 的滤波器组,进行可视化,结果如图 1:

    在这里插入图片描述

    图 1 38 个滤波器

    可以看到前 18 个是高斯滤波器一阶导数,后 18 个是高斯滤波器二阶导数(六个方向,三个大小)。最后两个依次是 isotropic 高斯和 LoG 滤波器。

    2. numColorRegions 参数对结果的影响

    选取“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 比较合适。

    3. numTextureRegions 参数对结果的影响

    仍然选取“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 比较合适。

    4. k 参数对结果的影响

    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 值。

    5. winSize 参数对结果的影响

    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 的时候结果更宽泛。(单个区域变大)。但是其对颜色分割没有影响。

    6. 不同滤波器对结果的影响

    之前的图 1 对滤波器进行了可视化,这里再次放出结果图片。

    在这里插入图片描述

    可以看到滤波器组是按大小、方向和类型组织的。

    下面对只用一阶导数高斯滤波器,二阶导数高斯滤波器和 isotropic 高斯和 LoG 滤波器进行结果展示:

    选取“gumballs.jpg”为例:

    winSize = 10,numColorRegions = 7,numTextureRegions = 7,k=10 保持不变。

    结果如图 18、19、20、21 所示。

    在这里插入图片描述

    图 18 只用一阶导数高斯

    在这里插入图片描述

    图 19 只用二阶导数高斯

    在这里插入图片描述

    图 20 只用 isotropic 高斯

    在这里插入图片描述

    图 21 只用 LoG

    7. 不同次运行对结果的影响

    K-means 每次初始化中心点不同,相同参数下的运行也有不同结果。

    选取“gumballs.jpg”为例:

    winSize = 10,numColorRegions = 2,numTextureRegions = 2,k=10 保持不变。

    分别运行 3 次,结果如图 22、23、24 所示。

    在这里插入图片描述

    图 22 第一次运行

    在这里插入图片描述

    图 23 第二次运行

    在这里插入图片描述

    图 24 第三次运行

    8. 其他测试图片示例

    对于测试图片,“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

  • 相关阅读:
    mac如何创建mysql数据库
    java计算机毕业设计小区宠物管理系统源程序+mysql+系统+lw文档+远程调试
    [Swift]国际化
    BUUCTF reverse wp 91 - 95
    Oracle-RAC集群不同节点数据查询不一致
    【关于Anaconda闪退无法启动】新版本anaconda3中ssl模块缺失的问题
    WPF入门教程系列二十五——DataGrid使用示例(2)
    JS之函数的属性
    【HTML】表格标签,语义化
    Windows提权
  • 原文地址:https://blog.csdn.net/newlw/article/details/125619862