基于k-均值聚类的图像分割
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的各项细节操作