美文网首页程序员
基于k-均值聚类的图像分割

基于k-均值聚类的图像分割

作者: 续袁 | 来源:发表于2018-11-22 21:29 被阅读93次

    1.知识储备

    1.0 window系统截图(当前窗口)

    Alt + PrintScreen

    1.1 Matlab中 K-means聚类函数

    [Idx,Ctrs,SumD,D] = kmeans(X,K,'Replicates',3,'Options',opts);
    %调用Kmeans函数
    %X N*P的数据矩阵
    % K:  聚类数目
    %Idx N*1的向量,存储的是每个点的聚类标号
    %Ctrs K*P的矩阵,存储的是K个聚类质心位置
    %SumD 1*K的和向量,存储的是类间所有点与该类质心点距离之和
    %D N*K的矩阵,存储的是每个点与所有质心的距离;
     
    [Idx,Ctrs,SumD,D] = kmeans(X,K,'Replicates',3,'Options',opts);
    
    

    1.2 注释

    在MATLAB中可以在行首部加%来进行注释,加%%+空格来进行划分不同的程序段。

    但在进行多行注释时,针对单行进行操作过于麻烦,可以利用快捷键进行多行注释。

    可以先选中需要注释的行,然后按“ctrl+R”进行注释,

    如果要取消多行注释,则在选中的基础上,按“ctrl+T”。

    1.3 matlab判断数据的类型

    用class(var)指令获取矩阵类型

    1.4 matlab 读取.mat文件 matlab将struct和cell转换成matrices

    之前将数组或者矩阵保存为一个mat格式的文件,在进行load命令读取时:
    bank = load('filterBank.mat');
    得到的bank是struct类型的数据,而想要的是一个矩阵或者数组。
    将命令:
    bank = load('filterBank.mat');
    改写为:
    bank = cell2mat(struct2cell(load('filterBank.mat')));
    得到的bank即为矩阵。

    1.5 matlab清空控制台

    命令语句: clc

    1.6 matlab二维矩阵输出彩色图像

    imagesc(colorLabelIm)
    colorbar

    1.7 matlab画图

    data = randn(4,100);
    figure(1);
    subplot(221);plot(data(1,:));
    subplot(222);plot(data(2,:));
    subplot(223);plot(data(3,:));
    subplot(224);plot(data(4,:));
    suptitle('总图标题');
    

    2. segmentMain.m

    origIm4 =imread('E:\桌面\1研究生相关\研一上\机器视觉基础\Proj1-Texture\Texture\a2-code-data\dress.jpg');
    origIm1 =imread('E:\桌面\1研究生相关\研一上\机器视觉基础\Proj1-Texture\Texture\a2-code-data\circle-im-1.jpg');
    origIm2 =imread('E:\桌面\1研究生相关\研一上\机器视觉基础\Proj1-Texture\Texture\a2-code-data\butterfly.jpg');
    origIm3 =imread('E:\桌面\1研究生相关\研一上\机器视觉基础\Proj1-Texture\Texture\a2-code-data\circle-im-2.jpg');
    origIm =imread('E:\桌面\1研究生相关\研一上\机器视觉基础\Proj1-Texture\Texture\a2-code-data\gumballs.jpg');
    
    %[width,height] = size(origIm);
    [height,width] = size(origIm);
    subplot(1,3,1);
    imshow(origIm)
    title('原图像');
    %bank = load('filterBank.mat');
    bank = cell2mat(struct2cell(load('filterBank.mat'))); 
    str =class(bank);  %判断bank类型  disp(str);
    imStack = {rgb2gray(origIm)} ;    %
    %imStack = {rgb2gray(origIm),rgb2gray(origIm1),rgb2gray(origIm2),rgb2gray(origIm3),rgb2gray(origIm4)};  
    
    % disp(bank); %打印过滤器
    [m,n,l] =size(bank);
    bankNum1 = size(bank, 1);
    bankNum2 = size(bank, 2);
    bankNum = size(bank, 3);
    disp(bankNum);
    % disp(bankNum1);
    % disp(m);
    % disp(n);
    % disp(l);
    winSize = 10;
    numColorRegions =10;  % 聚类数
    numTextureRegions = 50 ;   % 聚类数
    %bank =ones(5,6,7);
    %textons_x = 600;  
    %textons =ones(textons_x,bankNum);   
    k = 100;   %纹理基元的纹理编码集个数
    textons = createTextons(imStack, bank, k);
    %height = 100 ;
    %winSize =ones(height,height);
    
    
    %colorLabelIm = ones(height, width) ;
    %textureLabelIm =ones(height, width);
    [colorLabelIm, textureLabelIm] = compareSegmentations(origIm, bank, textons, winSize, numColorRegions, numTextureRegions);
    % disp(colorLabelIm);
    [mc,nc,lc] =size(colorLabelIm);
    [mt,nt,lt] =size(textureLabelIm);
    fprintf('row is %d,col is %d,%d ',mc,nc,lc);
    fprintf('row is %d,col is %d,%d ',mt,nt,lt);
    subplot(1,3,2);
    %imshow(uint8(colorLabelIm));% 输出为黑白图  
    x2=[150+width,350+2*width];
    y2=[50+height,50+2*height];
    imagesc(x2,y2,colorLabelIm)
    colorbar
    %colorbar('position',[0.32 0.01 0.3 0.5])
    title('颜色分割');
    subplot(1,3,3);
    %imshow(uint8(textureLabelIm));% 输出为黑白图
    x3=[250+2*width,450+3*width];
    y3=[50+2*height,50+3*height];
    imagesc(x3,y3,textureLabelIm)
    %imagesc(textureLabelIm)
    colorbar  %定义图例位置大小
    title('纹理分割');
    %suptitle('图像名:gumballs.jpg  滤波器: filterBank  条件:winSize=%d  nColor=%d  nTexture=%d  texttonsNum=%d ',winSize,numColorRegions,numTextureRegions,k);
    suptitle('图像名:gumballs.jpg  滤波器: filterBank  条件:winSize=  nColor=  nTexture=  texttonsNum= ')
    % imshow(colorLabelIm,[]);  % 输出为黑白图  
    
    
    

    2.1 精简改良版

    
    

    3.错误解析

    3.1 Error using conv2 N-D arrays are not supported

    For color images, imread returns a 3D array where the 3rd dimension has 3 elements for R, G, B. You need to convert the image to grey-value first. Or do the convolution on the color image using convn.
    rgb2gray(origIm);

    参考资料

    [0] 基于k-均值聚类的图像分割
    [1]MATLAB K-means聚类的介绍与使用
    [2] [初学笔记] matlab中 怎么判断输入的数据类型

    [3]matlab—load命令读的数据为struct类型的数据的处理方法
    [4] struct2cell
    [5] matlab中元胞数组的创建与内容读取

    [6]浅析image,imagesc,imshow的用法
    [7] Error using conv2 N-D arrays are not supported

    [8]subplot画图添加总标题
    [9] matlab怎么同时显示imshow 两幅图片
    [10] 171103 Matlab subplot 用法
    [11] matlab 中imagesc的用法
    [12] Matlab的图像操作——colorbar的各项细节操作

    相关文章

      网友评论

        本文标题:基于k-均值聚类的图像分割

        本文链接:https://www.haomeiwen.com/subject/fmulqqtx.html