博客
关于我
基于k均值聚类的图像分割
阅读量:205 次
发布时间:2019-02-28

本文共 4875 字,大约阅读时间需要 16 分钟。

图像分割实验设计与分析

实验目的

通过编程实现图像分割,将彩色图像分割为若干个同质区域。采用K-means聚类算法,将像素分组实现图像分割。分别基于颜色特征和纹理特征进行实验,分析两种视觉特征在图像分割中的性能。

实验设计

实验设计包含4个功能函数,分别实现图像分割的不同方面。

1. 生成隶属度矩阵

函数说明:

  • 输入:hwd的矩阵featIm,h和w为图像高度和宽度,d为特征向量维数。
  • 输入:k个聚类中心点的矩阵meanFeatures(k*d矩阵)。
  • 输出:labelIm,h*w的整数矩阵,表示每个像素所属的聚类标号(1...k)。
  • 实现思路:
    • 计算每个像素到k个中心点的距离,选取最近的中心点作为标记值。
    • 返回隶属度矩阵labelIm。

代码展示:

function [labelIm] = quantizeFeats(featIm, meanFeats)    height = size(featIm, 1);    width = size(featIm, 2);    dimension = size(featIm, 3);    labelIm = ones(height, width);        for h = 1:height        for w = 1:width            minDis = -1;            for k = 1:size(meanFeats, 1)                dis = 0;                for d = 1:dimension                    dis = dis + pow(featIm(h, w, d) - meanFeats(k, d), 2);                end                dis = sqrt(dis);                if minDis < 0 || dis < minDis                    labelIm(h, w) = k;                    minDis = dis;                end            end        end    endend

2. 生成纹理基元编码集

函数说明:

  • 输入:长度为n的元胞数组imStack,滤波器组bank。
  • 输出:k*d矩阵textons,表示纹理基元编码集。
  • 实现思路:
    • 使用滤波器组过滤所有图像,提取滤波器响应样本。
    • 将响应样本组合成大样本集,利用K-means聚类生成纹理基元集。

代码展示:

function [textons] = createTextons(imStack, bank, k)    [row, col] = size(imStack);    bankNum = size(bank, 3);        textonsData = [];    for i = 1:row        for j = 1:col            im = imStack{i, j};            im = im2double(im);            responses = zeros(size(im, 1), size(im, 2), bankNum);            for r = 1:bankNum                responses(:,:,r) = conv2(im, double(bank(:,:,r)), 'same');            end            X = reshape(responses, size(responses, 1)*size(responses, 2), bankNum);            Xrow = size(X, 1);            ranX = X(randperm(Xrow, ceil(Xrow/1000)));            textonsData = [textonsData; ranX];        end    end    [~, textons] = kmeans(textonsData, k);end

3. 构建纹理柱状图

函数说明:

  • 输入:灰度图像origIm,滤波器组bank,纹理基元编码集textons,窗口大小winSize。
  • 输出:rck矩阵featIm,表示纹理柱状图。
  • 实现思路:
    • 使用滤波器组过滤图像,生成滤波器响应矩阵。
    • 计算像素到纹理基元的隶属度矩阵feattexton。
    • 统计邻域窗口内每个纹理基元的频率,生成纹理柱状图featIm。

代码展示:

function [featIm] = extractTextonHists(origIm, bank, textons, winSize)    origIm = im2double(origIm);    [row, col] = size(origIm);    bankNum = size(bank, 3);        responses = zeros(row, col, bankNum);    for r = 1:bankNum        responses(:,:,r) = conv2(origIm, double(bank(:,:,r)), 'same');    end    X = reshape(responses, size(responses, 1)*size(responses, 2), bankNum);    dis2textons = dist2(textons, X);    [~, indxtexton] = max(dis2textons);    feattexton = reshape(indxtexton, row, col);        if winSize > 1        colNumLeft = floor((winSize-1)/2);        colNumRight = ceil((winSize-1)/2);        for i = 1:colNumLeft            feattexton = [feattexton(:, 1:end)];        end        for i = 1:colNumRight            feattexton = [feattexton; feattexton(1:end, :)];        end    end        featIm = zeros(row, col, size(textons, 1));    for i = (1+colNumLeft):size(feattexton, 1)-colNumRight        for j = (1+colNumLeft):size(feattexton, 2)-colNumRight            window = feattexton((i-colNumLeft): (i+colNumRight), (j-colNumLeft): (j+colNumRight));            frequency = tabulate(window(:));            for k = 1:size(frequency, 1)                textonIndex = int64(frequency(k, 1));                count = int32(frequency(k, 2));                featIm(i-colNumLeft, j-colNumLeft, textonIndex) = featIm(i-colNumLeft, j-colNumLeft, textonIndex)+count;            end        end    endend

4. 计算两种图像分割结果

函数说明:

  • 输入:原始图像origIm,滤波器组bank,纹理基元编码集textons,窗口大小winSize,理想分割数目numColorRegions和numTextureRegions。
  • 输出:基于颜色和纹理的分割结果矩阵colorLabelIm和textureLabelIm。
  • 实现思路:
    • 调用quantizeFeats函数进行颜色分割。
    • 提取纹理柱状图featIm,调用quantizeFeats函数进行纹理分割。

代码展示:

function [colorLabelIm, textureLabelIm] = compareSegmentations(origIm, bank, textons, winSize, numColorRegions, numTextureRegions)    origIm = im2double(origIm);        % 颜色分割    colordata = reshape(origIm, size(origIm, 1)*size(origIm, 2), size(origIm, 3));    opts = statset('Display', 'final', 'MaxIter', 1000);    [~, colorCenter] = kmeans(colordata, numColorRegions, 'Options', opts);    colorLabelIm = quantizeFeats(origIm, colorCenter);        % 纹理分割    grayIm = rgb2gray(origIm);    featIm = extractTextonHists(grayIm, bank, textons, winSize);    featImData = reshape(featIm, size(featIm, 1)*size(featIm, 2), size(featIm, 3));    [~, textureCenter] = kmeans(featImData, numTextureRegions, 'Options', opts);    textureLabelIm = quantizeFeats(featIm, textureCenter);        return;end

实验分析

通过实验分析,观察不同参数对图像分割效果的影响。以下是一些关键发现:

  • 颜色分割参数调整

    • 改变分割数目numColorRegions会直接影响颜色分割的效果。合理的numColorRegions值能提高分割的准确性。
    • 不同的初始中心点可能导致颜色分割结果的微小差异。
  • 纹理分割参数调整

    • 类似的,numTextureRegions的选择对纹理分割效果有重要影响。应根据图像纹理特点选择合适的参数。
    • 窗口大小winSize的选择直接影响纹理特征提取的效果,需根据图像纹理单元大小进行优化。
  • 纹理编码集计算方法

    • 使用所有图片生成纹理编码集的效果通常优于只使用单一测试图片。
    • 不同的纹理编码集版本可能会导致纹理分割结果的差异。
  • 窗口大小的影响

    • 较小的窗口大小可能适合细粒度的纹理特征,较大的窗口更适合大尺度纹理模式。
    • 选择适中窗口大小通常能获得更好的分割效果。
  • 通过以上实验,可以看出K-means聚类算法对图像分割的敏感性,合理的参数选择和适当的特征提取方法能显著提升分割效果。

    转载地址:http://mkdi.baihongyu.com/

    你可能感兴趣的文章
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>