博客
关于我
基于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/

    你可能感兴趣的文章
    MYSQL sql语句针对数据记录时间范围查询的效率对比
    查看>>
    mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
    查看>>
    mysql sysbench测试安装及命令
    查看>>
    mysql Timestamp时间隔了8小时
    查看>>
    Mysql tinyint(1)与tinyint(4)的区别
    查看>>
    MySQL Troubleshoting:Waiting on query cache mutex
    查看>>
    mysql union orderby 无效
    查看>>
    mysql v$session_Oracle 进程查看v$session
    查看>>
    mysql where中如何判断不为空
    查看>>
    MySQL Workbench 使用手册:从入门到精通
    查看>>
    MySQL Workbench 数据库建模详解:从设计到实践
    查看>>
    MySQL Workbench 数据建模全解析:从基础到实践
    查看>>
    mysql workbench6.3.5_MySQL Workbench
    查看>>
    MySQL Workbench安装教程以及菜单汉化
    查看>>
    MySQL Xtrabackup 安装、备份、恢复
    查看>>
    mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
    查看>>
    MySQL _ MySQL常用操作
    查看>>
    MySQL – 导出数据成csv
    查看>>
    MySQL —— 在CentOS9下安装MySQL
    查看>>
    MySQL —— 视图
    查看>>