基于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的各项细节操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352