24小时热门版块排行榜    

查看: 2269  |  回复: 10

xiyue6911

新虫 (小有名气)


已领完
基于Kmeans的图像聚类算法
领取红包 (小木虫手机app专属红包)

扫一扫,下载小木虫客户端

使用方法:直接在matlab中运行,但注意更改图片路径名;
主要分三步:
1,初始化聚类中心,我使用K等分点做的;
2,随机性采样,出于效率的考虑;
3,剩余点划分,将未采集到的图像剩余点划分到簇类中。
clc;clear all;close all;
%% Kmeans聚类图像
K = 4;
im = imread('penguin.jpg');
im = imresize(im,[321,321],'nearest');
[R c lmd] = size(im);
elenum = numel(im(:,:,1));
total = [1:elenum];%总体;
dt = 0.1;%聚类中心迭代阈值;
for i = 1:size(im,lmd) %Cij表示第i波段成像,第j个
    min_c = min(min(im(:,:,i)));
    max_c = max(max(im(:,:,i)));
    for k = 1:K
        C(i,k) = min_c + k*((max_c - min_c)/(K + 1));
    end
end
C = double(C);
C_orgi = C;%初始聚类中心;
%修改图像的存储模式
points(elenum) = struct('r',0,'g',0,'b',0,'cluster',0);
for i = 1:R
    for j = 1:c
        points((j-1)*R + i).r = im(i,j,1);
        points((j-1)*R + i).g = im(i,j,2);
        points((j-1)*R + i).b = im(i,j,3);
        points((j-1)*R + i).cluster = 0;
    end
end
smplrate = 1/10000;
smplseq = sort(randperm(elenum,ceil(elenum*smplrate)),'ascend');%随机性采样M*N个图像样本点
cluster(K,100) =  struct('r',1,'c',1,'data',points(1));%存储簇类每行存储该簇类的样本点
counter(K) = 0;%记录每个簇类的样本点个数;
totalnum = 100;%聚类迭代最大次数;
for iteration = 1:totalnum
for i = smplseq
    for j = 1:K
        ptvalue(1,1) = points(i).r;
        ptvalue(2,1) = points(i).g;
        ptvalue(3,1) = points(i).b;
        distclust(j) = norm(double(ptvalue) - double(C(:,j)));%存储样本点到聚类的距离;
    end
    clunum = find(distclust == min(distclust));%样本点距离聚类中心最小的簇类编号;
    points(i).cluster = clunum;%标记该样本点类型;
    counter(clunum) = counter(clunum) + 1;%样本计数增加一个
    cluster(clunum,counter(clunum)).r = mod(i,R);
    cluster(clunum,counter(clunum)).c = floor(i/R)+1;
    cluster(clunum,counter(clunum)).data = points(i);
end
%更新每个聚类中心的
for i = 1:K
    sum = repmat(double(0),[3,1]);
    for j = 1:counter(i)
        ptvalue(1,1) = cluster(i,j).data.r;
        ptvalue(2,1) = cluster(i,j).data.g;
        ptvalue(3,1) = cluster(i,j).data.b;
        sum = sum + double(ptvalue);
    end
    if  i == 1
        C_new = sum/counter(i);
    else
        C_new = cat(2,C_new,sum/counter(i));
    end
end
    if norm(abs(C-C_new)) < dt
        break;
    end
C = C_new;
end
% 参数显示;
%disp('随机样本个数'),disp(size(smplseq,2));disp('初始聚类中心:');disp(C_orgi);disp('Kmeans 聚类新中心');disp(C);disp('聚类迭代次数');disp(iteration);
smpldiff = setdiff(total,smplseq);
for i = smpldiff
    for j = 1:K
        ptvalue(1,1) = points(i).r;
        ptvalue(2,1) = points(i).g;
        ptvalue(3,1) = points(i).b;
        distclust(j) = norm(double(ptvalue) - double(C_new(:,j)));%存储样本点到聚类的距离;
    end
    clunum = find(distclust == min(distclust));%样本点距离聚类中心最小的簇类编号;
    points(i).cluster = clunum;%标记该样本点类型;
    counter(clunum) = counter(clunum) + 1;%样本计数增加一个
    cluster(clunum,counter(clunum)).r = mod(i,R);
    cluster(clunum,counter(clunum)).c = floor(i/R)+1;
    cluster(clunum,counter(clunum)).data = points(i);
end
clusmap = zeros(R,c);
count = 0;
for i = 1:numel(points)
    r = mod((i-1),R)+1;
    c = ceil(i/R);%一维索引转换为二维索引,按列
    if points(i).cluster~=0
        clusmap(c,r) = points(i).cluster;
        count = count + 1;
    end
end
clusmap = clusmap';
stats = regionprops(clusmap);
imshow(clusmap,[]);
回复此楼

» 收录本帖的淘帖专辑推荐

国自科基金标书 科研资料 source 软件控

» 猜你喜欢

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

wake_up

木虫 (著名写手)



小木虫: 金币+0.5, 给个红包,谢谢回帖
基于Kmeans的图像聚类算法

Matlab自带的Kmeans支持并行计算, 快
8楼2015-10-26 13:13:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

青青呀呀

新虫 (正式写手)



小木虫: 金币+0.5, 给个红包,谢谢回帖
我当初看着Origin自己起码会用用了,就夸大其词的说,听说Matlab更加高大上,我也要学,看着楼主天书般的帖子,我真想说,还好我只是说说而已…

发自小木虫IOS客户端
7楼2015-10-25 22:29:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiyue6911

新虫 (小有名气)


引用回帖:
8楼: Originally posted by wake_up at 2015-10-26 13:13:19
Matlab自带的Kmeans支持并行计算, 快

谢谢 一会儿试一试

发自小木虫Android客户端
9楼2015-10-26 14:47:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiyue6911

新虫 (小有名气)


引用回帖:
8楼: Originally posted by wake_up at 2015-10-26 13:13:19
Matlab自带的Kmeans支持并行计算, 快

%% Kmeans聚类图像;
im = imread('penguin.jpg');
im = imresize(im,[256,256]);
im_new = size(im(:,:,1));
im_r = im(:,:,1);im_r = im_r(;
im_g = im(:,:,2);im_g = im_g(;
im_b = im(:,:,3);im_b = im_b(;
datas = double([im_r im_g im_b]);
opts = statset('Display','final');
[idx,ctrs] = kmeans(datas,4,'Distance','sqEuclidean','Options',opts);
im_new = reshape(idx,[256 256]);

与我写的满足一样的功能,使用matlab就是快,还是谢谢
10楼2015-10-26 22:10:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zphpinganye

铁虫 (正式写手)


11楼2018-03-13 12:45:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
2015-10-25 22:05   回复  
xiyue6911(金币+1): 谢谢参与
已获得1个金币 发自小木虫Android客户端
2015-10-25 22:05   回复  
xiyue6911(金币+1): 谢谢参与
已获得1个金币 发自小木虫IOS客户端
2015-10-25 22:05   回复  
xiyue6911(金币+1): 谢谢参与
已获得1个金币 发自小木虫Android客户端
nqqtmm5楼
2015-10-25 22:05   回复  
xiyue6911(金币+1): 谢谢参与
已获得1个金币 发自小木虫IOS客户端
2015-10-25 22:05   回复  
xiyue6911(金币+1): 谢谢参与
已获得1个金币 发自小木虫Android客户端
相关版块跳转 我要订阅楼主 xiyue6911 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见