转自:直觉模糊C均值聚类与图像阈值分割 - liyuefeilong的专栏 - CSDN博客 https://blog.csdn.net/liyuefeilong/article/details/43816495

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % 主函数
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. function main
  5. ima = imread('MR6.jpg');
  6. % 先设定FCM的几个初始参数
  7. options=[; % FCM公式中的参数m
  8. ; % 最大迭代次数
  9. 1e-]; % 目标函数的最小误差
  10. class_number = ; % 分为4
  11. imt = ImageSegmentation(ima,class_number,options)
  12. subplot(,,),imshow(ima),title('原图');
  13. subplot(,,),imshow(imt); %显示生成的分割的图像
  14. kk = strcat('分割成',int2str(class_number),'类的输出图像');
  15. title(kk);
  16.  
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  18. % ImageSegmentation()函数:实现聚类分割图像
  19. % 输入:file为灰度图像文件 cluster_n为聚类类别个数 options为预设的初始参数
  20. % 输出分割后的图像
  21. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  22. function imt = ImageSegmentation(file, cluster_n, options)
  23. ima = file;
  24. I = im2double(file);
  25. [x,y] = size(ima);
  26. number = x * y; % 图像的元素个数numel(I)
  27. data = reshape(I,number,); %将矩阵元素转换为一列数据
  28. [center, U] = FCMprocess(data,cluster_n,options); %调用FCMData函数进行聚类
  29. % 对于每个元素对不同聚类中心的隶属度,找出最大的那个隶属度
  30. maxU = max(U); % 找出每一列的最大隶属度
  31. temp = sort(center);
  32. for i = :cluster_n; % 按聚类结果分割图像
  33. % 前面求出每个元素的最大隶属度,属于各聚类中心的元素坐标,并存放这些坐标
  34. % 调用eval函数将括号里的字符串转化为命令执行
  35. eval(['class_',int2str(i), '= find(U(', int2str(i), ',:) == maxU);']);
  36. %gray = round( * (i-) / (cluster_n-));
  37. index = find(temp == center(i));
  38. switch index
  39. case
  40. gray = ;
  41. case cluster_n
  42. gray = ;
  43. otherwise
  44. gray = fix(*(index-)/(cluster_n-));
  45. end
  46. eval(['I(class_',int2str(i), '(:))=', int2str(gray),';']);
  47. end;
  48. imt = mat2gray(I);
  49.  
  50. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  51. % 用于计算聚类中心、隶属度矩阵和目标函数
  52. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  53. function [center, U] = FCMprocess(data, cluster_num, options)
  54. %data为聚类数据,cluster_num为类别数
  55. m = options(); % 参数m
  56. max_iteration = options(); % 最终的迭代次数
  57. min_deviation = options(); % 最小判别误差
  58. data_number = size(data, ); % 元素个数
  59. obj_function = zeros(max_iteration, ); % obj_function用于存放目标函数的值
  60. % 生成隶属度矩阵U
  61. U = rand(cluster_num, data_number); % 随机生成隶属度矩阵U
  62. sumU = sum(U,); % 计算U中每列元素和
  63. for k = :data_number
  64. U(:,k) = U(:,k) ./ sumU(k); % 对隶属矩阵U进行归一化处理
  65. end
  66.  
  67. for i = :max_iteration
  68. [U, center, obj_function(i)] = FCMStep(data, U, cluster_num, m); %调用FCMStep函数进行迭代
  69. fprintf('第%d次迭代, 目标函数值为%f\n', i, obj_function(i));
  70. % 检查迭代终止条件
  71. if i > ,
  72. if abs(obj_function(i) - obj_function(i-)) < min_deviation
  73. break;
  74. end
  75. end
  76. end
  77.  
  78. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  79. % 该函数用于每次迭代过程
  80. function [newU,center,obj_function] = FCMStep(data, U, cluster_num, m)
  81. % data为被聚类数据,U为隶属度矩阵,cluster_num为聚类类别数,mFCM中的参数m
  82. % 函数调用后得到新的隶属度矩阵newU,聚类中心center,目标函数值obj_function
  83. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  84. % 以下是计算模糊隶属度Ut
  85. [x,y] = size(U);
  86. A = ones(x,y);
  87. a = 0.85;
  88. Ut = abs(A - U -(A - (U).^a).^(/a));
  89. Ud = U + Ut;
  90. [j,k,l] = size(data);
  91. pp = y;
  92. pai = (sum(Ut,)) ./pp;
  93. obj = sum(pai.*exp(-pai));
  94. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  95. % Ud = U;
  96. % obj = ;
  97. nf = Ud;
  98. mf = Ud.^m; % FMC中的U^m
  99. % center = nf*data./((ones(size(data, ), )*sum(nf'))'); % 得到聚类中心
  100.  
  101. data1 = zeros(x,y);
  102. data1(,:) = data';
  103. data1(,:) = data';
  104. data1(,:) = data';
  105. data1(,:) = data';
  106. % data1(,:) = data';
  107. center = sum(nf.*data1,)./sum(nf,); % 得到聚类中心
  108.  
  109. dist = Distance(center, data); % 调用myfcmdist函数计算聚类中心与被聚类数据的距离
  110. obj_function = sum(sum((dist.^).*mf))+obj; % 得到目标函数值
  111. tmp = dist.^(-/(m-)); % 如果迭代次数不为1,计算新的隶属度矩阵
  112. newU = tmp./(ones(cluster_num, )*sum(tmp)); % U_new为新的隶属度矩阵
  113.  
  114. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  115. % Distance()函数用于计算聚类中心与被聚类数据的距离
  116. % center为聚类中心,data为被聚类数据,输出各元素到聚类中心的距离out
  117. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  118. function out = Distance(center, data)
  119.  
  120. data_number = size(data,);
  121. class_number = size(center, );
  122. kk = ones(data_number,); % 构造与数据大小相同的全1矩阵kk
  123. out = zeros(class_number, data_number);
  124. if size(center, ) > , %若类别数大于1
  125. for k = :class_number
  126. out(k, :) = sqrt(sum(((data - kk...
  127. *center(k,:)).^)'));
  128. end
  129. else % data为一维数据
  130. for k = :class_number
  131. out(k, :) = abs(center(k) - data)';
  132. end
  133. end

图像模糊C均值聚类分割代码的更多相关文章

  1. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

  2. 基于核方法的模糊C均值聚类

    摘要: 本文主要针对于FCM算法在很大程度上局限于处理球星星团数据的不足,引入了核方法对算法进行优化.  与许多聚类算法一样,FCM选择欧氏距离作为样本点与相应聚类中心之间的非相似性指标,致使算法趋向 ...

  3. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  4. 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测

    据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...

  5. 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

    k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...

  6. Python实现kMeans(k均值聚类)

    Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...

  7. 多核模糊C均值聚类

    摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...

  8. 机器学习理论与实战(十)K均值聚类和二分K均值聚类

    接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...

  9. 图像检索(2):均值聚类-构建BoF

    在图像检索时,通常首先提取图像的局部特征,这些局部特征通常有很高的维度(例如,sift是128维),有很多的冗余信息,直接利用局部特征进行检索,效率和准确度上都不是很好.这就需要重新对提取到的局部特征 ...

随机推荐

  1. Memory Network

    转自:https://www.jianshu.com/p/e5f2b20d95ff,感谢分享! 基础Memory-network 传统的RNN/LSTM等模型的隐藏状态或者Attention机制的记忆 ...

  2. 【Hibernate】Hibernate关联关系的映射

    一.实体之间的关系 二.一对多的配置 2.1 第一步创建两个实体 2.2 第二步:配置映射文件 2.3 第三步:将映射放到核心配置文件中 三.级联 3.1 Hibernate中级联保存的效果 3.2 ...

  3. 关于PPP拨号 和 AT指令实现GPRS模块联网的疑问

    以下内容摘抄自互联网: ppp拨号 与 at命令的疑问 GPRS模块在Linux平台上ppp拨号上网总结与心得 以PPP拨号实现GPRS与因特网的数据通信的具体实现流程 问: 我刚接触GPRS,了解A ...

  4. 企业级自动化运维工具应用实战ansible

    公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运维老大 ...

  5. 通用mapper的增删改查方法 留存 备忘

    Mybatis通用Mapper介绍与使用   前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...

  6. 如何利用while语句打印“九九乘法口诀表”

    需求:输出九九乘法表 plus.py代码如下: i=1 j=1 while i<=9: j=1 while j<=i: print(j,'*',i,'=',str(i*j)+' ',end ...

  7. PAT Basic 1055 集体照 (25 分)

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 /(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位 ...

  8. Codeforces 567C - Geometric Progression - [map维护]

    题目链接:https://codeforces.com/problemset/problem/567/C 题意: 给出长度为 $n$ 的序列 $a[1:n]$,给出公比 $k$,要求你个给出该序列中, ...

  9. mysql打开报错2013解决办法

    修改mysql配置文件 在[mysqld]下面设置skip-name-resolve 重启mysql from :https://www.jb51.net/article/52637.htm

  10. 关键字final 修饰类、方法、属性、参数类型

    笔记: /** 关键字final(最终的) 标记的类不能被继承, 提高安全性,提高程序的可读性 * 1.final 修饰类,这个类就不能被继承: 如:String类.StringBuffer类.Sys ...