程序员

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

2018-11-22  本文已影响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的各项细节操作

上一篇下一篇

猜你喜欢

热点阅读