matlab下利用K-Means进行图像分类
FIRST & BEST SOLUTION
clear all;
clc;
I_rgb=imread('dog.jpg');
figure();imshow(I_rgb);title('原始图像');
%去噪
filter=ones(5,5);
filter=filter/sum(filter(:));
denoised_r=conv2(I_rgb(:,:,1),filter,'same');
denoised_g=conv2(I_rgb(:,:,2),filter,'same');
denoised_b=conv2(I_rgb(:,:,3),filter,'same');
denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
D_rgb=uint8(denoised_rgb);
figure();imshow(D_rgb);title('去噪后图像');%去噪后的结果
%将彩色图像从RGB转化到lab彩色空间
C =makecform('srgb2lab'); %设置转换格式
I_lab= applycform(D_rgb, C);
%进行K-mean聚类将图像分割成2个区域
ab =double(I_lab(:,:,2:3)); %取出lab空间的a分量和b分量
nrows= size(ab,1);
ncols= size(ab,2);
ab =reshape(ab,nrows*ncols,2);
nColors= 4; %分割的区域个数为4
[cluster_idx,cluster_center] =kmeans(ab,nColors,'distance','sqEuclidean','Replicates',2); %重复聚类2次
pixel_labels= reshape(cluster_idx,nrows,ncols);
%显示分割后的各个区域
segmented_images= cell(1,4);
rgb_label= repmat(pixel_labels,[1 1 3]);
for k= 1:nColors
color = I_rgb;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end
figure(),imshow(segmented_images{1}),title('分割结果——区域1');
figure(),imshow(segmented_images{2}),title('分割结果——区域2');
figure(),imshow(segmented_images{3}),title('分割结果——区域3');
figure(),imshow(segmented_images{4}),title('分割结果——区域4');%使分割后的图像在一个图中显示
m=uint8(rgb_label);
for i=1:69
for j=1:97
if m(i,j,1)==1
m(i,j,1)=255;
m(i,j,2)=0;
m(i,j,3)=0;
end
if m(i,j,1)==2
m(i,j,1)=256;
m(i,j,2)=256;
m(i,j,3)=0;
end
if m(i,j,1)==3
m(i,j,1)=0;
m(i,j,2)=0;
m(i,j,3)=255;
end
if m(i,j,1)==4
m(i,j,1)=0;
m(i,j,2)=128;
m(i,j,3)=0;
end
end
end
figure(),imshow(m)
将 调用k-means算法的那句更换成下面代码,自己实现k-means
cluster_idx=zeros(6693,1);
ct11=90;
ct12=90;
ct21=110;
ct22=110;
ct31=130;
ct32=130;
ct41=150;
ct42=150;
%初始分类
sum1=[0,0];
sum2=[0,0];
sum3=[0,0];
sum4=[0,0];
f1=0;
f2=0;
f3=0;
f4=0;
for k=1:20 for i=1:6693 d1=(ab(i,1)-ct11).^2+(ab(i,2)-ct12).^2; d2=(ab(i,1)-ct21).^2+(ab(i,2)-ct22).^2; d3=(ab(i,1)-ct31).^2+(ab(i,2)-ct32).^2; d4=(ab(i,1)-ct41).^2+(ab(i,2)-ct42).^2;
Z=[d1,d2,d3,d4];
m=min(Z);
if m==d1
cluster_idx(i)=1;
f1=1+f1;
sum1=sum1+ab(i,:);
end
if m==d2
cluster_idx(i)=2;
f2=f2+1;
sum2=sum2+ab(i,:);
end
if m==d3
cluster_idx(i)=3;
f3=f3+1;
sum3=sum3+ab(i,:);
end
if m==d4
cluster_idx(i)=4;
f4=f4+1;
sum4=sum4+ab(i,:);
end
end
ct11=sum1(1,1)/f1;
ct12=sum1(1,2)/f1;
ct21=sum2(1,1)/f2;
ct22=sum2(1,2)/f2;
ct31=sum3(1,1)/f3;
ct32=sum3(1,2)/f3;
ct41=sum4(1,1)/f4;
ct42=sum4(1,2)/f4;
end
ct1=[ct11,ct12];
ct2=[ct21,ct22];
ct3=[ct31,ct32];
ct4=[ct41,ct42];
ANOTHER SOLUTION
RGB= imread ('dog.jpg'); %读入图像
[m n]=size(RGB);   %m是数据个数,n是数据维度
figure(),imshow(RGB);title(' 图一 彩色原图像')
hold off;
RGB=double(RGB);
filter=ones(5,5);
filter=filter/sum(filter(:));
denoised_r=conv2(RGB(:,:,1),filter,'same');
denoised_g=conv2(RGB(:,:,2),filter,'same');
denoised_b=conv2(RGB(:,:,3),filter,'same');
denoised_rgb=cat(3, denoised_r, denoised_g, denoised_b);
RGB=uint8(denoised_rgb);
figure();imshow(RGB);title('去噪后图像');%去噪后的结果
RGB=double(RGB);
img1= RGB(:,:,1);
img2=RGB (:,:,2);
img3= RGB (:,:,3);
t=0;
c11(1)=4; c12(1)=4; c13(1)=4;
c21(1)=70; c22(1)=67; c23(1)=71;
c31(1)=100; c32(1)=100; c33(1)=100;
c41(1)=200; c42(1)=200; c43(1)=200;%选四个初始聚类中心
cluster_idx=zeros(69,97);
class1_num=0;
class2_num=0;
class3_num=0;
class4_num=0;
sum_class11=0;
sum_class21=0;
sum_class31=0;
sum_class41=0;
sum_class12=0;
sum_class22=0;
sum_class32=0;
sum_class42=0;
sum_class13=0;
sum_class23=0;
sum_class33=0;
sum_class43=0;
for k=1:20
    if t==0
       for i=1:69
            for j=1:97
                r=sqrt((img1(i,j)-c11(k))^2+(img2(i,j)-c12(k))^2+(img3(i,j)-c13(k))^2);
                g=sqrt((img1(i,j)-c21(k))^2+(img2(i,j)-c22(k))^2+(img3(i,j)-c23(k))^2);
                b=sqrt((img1(i,j)-c31(k))^2+(img2(i,j)-c32(k))^2+(img3(i,j)-c33(k))^2);
                q=sqrt((img1(i,j)-c41(k))^2+(img2(i,j)-c42(k))^2+(img3(i,j)-c43(k))^2); %计算各像素灰度与聚类中心的距离
                Z=[r,g,b,q];
                d=min(Z);
                if d==r
                   class1_num=class1_num+1;
                   cluster_idx(i,j)=1;
                   sum_class11=sum_class11+img1(i,j);
                   sum_class12=sum_class12+img2(i,j);
                   sum_class13=sum_class13+img3(i,j);
                end
                if d==g
                   class2_num=class2_num+1;
                   cluster_idx(i,j)=2;
                   sum_class21=sum_class21+img1(i,j);
                   sum_class22=sum_class22+img2(i,j);
                   sum_class23=sum_class23+img3(i,j);
                end
                if d==b
                   class3_num=class3_num+1;
                   cluster_idx(i,j)=3;
                   sum_class31=sum_class31+img1(i,j);
                   sum_class32=sum_class32+img2(i,j);
                   sum_class33=sum_class33+img3(i,j);
                end
                if d==q
                   class4_num=class4_num+1;
                   cluster_idx(i,j)=4;
                   sum_class41=sum_class41+img1(i,j);
                   sum_class42=sum_class42+img2(i,j);
                   sum_class43=sum_class43+img3(i,j);
                end
            end
       end
       c11(k+1)=sum_class11/class1_num;
       c21(k+1)=sum_class21/class2_num;
       c31(k+1)=sum_class31/class3_num;
       c41(k+1)=sum_class41/class4_num;%将所有低灰度求和取平均,作为下一个低灰度中心
       c12(k+1)=sum_class12/class1_num;
       c22(k+1)=sum_class22/class2_num;
       c42(k+1)=sum_class42/class4_num;
       c32(k+1)=sum_class32/class3_num;%将所有低灰度求和取平均,作为下一个中间灰度中心
       c13(k+1)=sum_class13/class1_num;
       c23(k+1)=sum_class23/class2_num;
       c43(k+1)=sum_class43/class4_num;
       c33(k+1)=sum_class33/class3_num;%将所有低灰度求和取平均,作为下一个高灰度中心
       d11=abs(c11(k+1)-c11(k));
       d12=abs(c12(k+1)-c12(k));
       d13=abs(c13(k+1)-c13(k));
       d21=abs(c21(k+1)-c21(k));
       d22=abs(c22(k+1)-c22(k));
       d23=abs(c23(k+1)-c23(k));
       d31=abs(c31(k+1)-c31(k));
       d32=abs(c32(k+1)-c32(k));
       d33=abs(c33(k+1)-c33(k));
       d41=abs(c41(k+1)-c41(k));
       d42=abs(c42(k+1)-c42(k));
       d43=abs(c43(k+1)-c43(k));
       if(d11<=0.001&&d12<=0.001&&d13<=0.001&&d21<=0.001&&d22<=0.001&&d23<=0.001&&d31<=0.001&&d32<=0.001&&d33<=0.001&&d41<=0.001&&d42<=0.001&&d43(k)<=0.001)
          t=1;
       end
    end
end
for i=1:69
    for j=1:97
        if cluster_idx(i,j)==1
           img1(i,j)=255;
           img2(i,j)=0;
           img3(i,j)=0;
        end
        if cluster_idx(i,j)==2
           img1(i,j)=256;
           img2(i,j)=256;
           img3(i,j)=0;
        end
        if cluster_idx(i,j)==3
           img1(i,j)=0;
           img2(i,j)=0;
           img3(i,j)=255;
        end
        if cluster_idx(i,j)==4
           img1(i,j)=0;
           img2(i,j)=128;
           img3(i,j)=0;
        end
    end
end
Img1=uint8(img1);
Img2=uint8(img2);
Img3=uint8(img3);
R=cat(3,Img1,Img2,Img3);
figure(),imshow(R);title('图二 聚类后的图像')
matlab下利用K-Means进行图像分类的更多相关文章
- matlab下K-means Cluster 算法实现
		
一.概念介绍 K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧 ...
 - win7下利用ftp实现华为路由器的上传和下载
		
win7下利用ftp实现华为路由器的上传和下载 1. Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...
 - win7下利用ftp实现华为路由器的配置文件上传和下载
		
win7下利用ftp实现华为路由器的配置文件上传和下载 1. Win7下ftp的安装和配置 (1)开始—>控制面板—>程序—>程序和功能—>打开或关闭Windows功能 (2 ...
 - (转载)Mac系统下利用ADB命令连接android手机并进行文件操作
		
Mac系统下利用ADB命令连接android手机并进行文件操作 标签: Mac adb android 2016-03-14 10:09 5470人阅读 评论(1) 收藏 举报 分类: Androi ...
 - SMTP协议--在cmd下利用bat命令行发送邮件
		
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 选择‘开始’-‘运行’,输入cmd,进入命令提示符窗口. Windows7默认没有开始Telnet服务,请在运 ...
 - 【java】 linux下利用nohup后台运行jar文件包程序
		
Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 ...
 - Windows环境下利用github快速配置git环境
		
在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的win ...
 - Mac下利用(xcode)安装git
		
Mac下利用(xcode)安装git 一.AppStore 最安全途径:搜索下载Xcode,(需要AppleID). 其他:直接百度Xcode下载. 二.Xcode 打开Xcode-->Pref ...
 - 介绍linux下利用编译bash设置root账号共用的权限审计设置
		
在日常运维工作中,公司不同人员(一般是运维人员)共用root账号登录linux服务器进行维护管理,在不健全的账户权限审计制度下,一旦出现问题,就很难找出源头,甚是麻烦!在此,介绍下利用编译bash使不 ...
 
随机推荐
- dp之最长上升子序列
			
普通做法是O(n^2)下面介绍:最长上升子序列O(nlogn)算法(http://blog.csdn.net/shuangde800/article/details/7474903) /* HDU 1 ...
 - 6.scala中的包
			
版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=287 排版乱?请移步原文获得更好的阅读体验 1.基础特性 scala中的包和java中的包类似,都是用来在大型工 ...
 - Pandas 数据分析基础
			
Pandas 安装 anaconda 安装: conda list pandas 查看是否已经安装 conda install pandas conda update pandas pip 安装 pi ...
 - Entity Framework 中 Schema是什么
			
在使用Entity Framework时,会注意到下面这句: protected override void OnModelCreating(DbModelBuilder modelBuilder) ...
 - maven--spring-boot-starter-parent 小结
			
Maven中的dependency的scope作用域详解 https://blog.csdn.net/itchiang/article/details/45009057 https://blog.cs ...
 - 从Github上轻松安装R包—githubinstall包--转载
			
1.综述 越来越多的R包正在由世界上不同的人所创建,其中一部分原因是devtools包使得开发R包1变得更加简单.devtools包不仅让开发R包变得简单,而且用于分发R包. 当开发者发布一个R包的时 ...
 - [PostgreSql]PostgreSql调用函数及用IF EXISTS判断表是否存在
			
1.创建一个函数function1 -- FUNCTION: public.function1(character varying, integer) -- DROP FUNCTION public. ...
 - 重新学习MySQL数据库8:MySQL的事务隔离级别实战
			
重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...
 - Java集合详解8:Java的集合类细节精讲
			
Java集合详解8:Java集合类细节精讲 今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http:// ...
 - echarts在vue中使用的感悟
			
echarts在vue中使用的感悟 echarts作为图表展示的强大存在,每当使用后台系统,或多或少都会使用到,但是作为菜鸟的我,则是一路采坑,各种头大,比比皆是,为了避免下次再犯同样的错误,特意记录 ...