24小时热门版块排行榜    

查看: 2708  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] filecode +11 documentary 2026-08-10 12/600 2026-08-12 12:42 by kudofaye
[基金申请] 不应该看fileCode +4 且听虎啸 2026-08-12 4/200 2026-08-12 12:40 by 行无人
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +5 Tide man 2026-08-11 5/250 2026-08-12 09:24 by kangban
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +7 布布和一二 2026-08-10 10/500 2026-08-12 09:12 by 布布和一二
[基金申请] 是这周出结果还是下周出结果? +3 yuleib84 2026-08-11 3/150 2026-08-11 21:53 by jnhyjjm
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +8 Tide man 2026-08-10 9/450 2026-08-11 20:39 by beefly
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 分享一下我之前已中青C的计划书的filecode +3 布布和一二 2026-08-11 4/200 2026-08-11 15:20 by aasahr
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +8 家与远方 2026-08-10 13/650 2026-08-11 09:49 by 家与远方
[基金申请] 关于代码变化问题,想知道的进来 +17 且听虎啸 2026-08-07 24/1200 2026-08-10 18:35 by zhangduo2008
[基金申请] 好奇怪的filecode +4 布布和一二 2026-08-08 5/250 2026-08-10 14:20 by 冰心玉壶晴
[基金申请] 据悉今年马上要出结果了 +7 瞬息宇宙 2026-08-10 8/400 2026-08-10 12:42 by Vivilian
[基金申请] 这样的filecode谁见过 +11 布布和一二 2026-08-08 22/1100 2026-08-10 11:10 by wmfsnow
[基金申请] filecode与中标关系的预测 +5 布布和一二 2026-08-07 5/250 2026-08-09 16:15 by 袁向阳007
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
[基金申请] 关于filecode,很负责任的告诉大家 +6 爱看书的可乐 2026-08-08 7/350 2026-08-08 22:13 by a_niu
[基金申请] 大家散了吧,后缀研究没有意义,别浪费时间了,过好目前的每一天,不要焦虑 +5 Tide man 2026-08-06 7/350 2026-08-07 13:11 by 医学老男孩
[基金申请] filecode +8 布布和一二 2026-08-06 11/550 2026-08-06 20:41 by tangpu318
[基金申请] 影响面上的因素 +8 布布和一二 2026-08-05 11/550 2026-08-06 10:41 by 宝贝虫子
信息提示
请填处理意见