图像模糊C均值聚类分割代码
转自:直觉模糊C均值聚类与图像阈值分割 - liyuefeilong的专栏 - CSDN博客 https://blog.csdn.net/liyuefeilong/article/details/43816495
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 主函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function main
ima = imread('MR6.jpg');
% 先设定FCM的几个初始参数
options=[; % FCM公式中的参数m
; % 最大迭代次数
1e-]; % 目标函数的最小误差
class_number = ; % 分为4类
imt = ImageSegmentation(ima,class_number,options)
subplot(,,),imshow(ima),title('原图');
subplot(,,),imshow(imt); %显示生成的分割的图像
kk = strcat('分割成',int2str(class_number),'类的输出图像');
title(kk); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ImageSegmentation()函数:实现聚类分割图像
% 输入:file为灰度图像文件 cluster_n为聚类类别个数 options为预设的初始参数
% 输出分割后的图像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function imt = ImageSegmentation(file, cluster_n, options)
ima = file;
I = im2double(file);
[x,y] = size(ima);
number = x * y; % 图像的元素个数numel(I)
data = reshape(I,number,); %将矩阵元素转换为一列数据
[center, U] = FCMprocess(data,cluster_n,options); %调用FCMData函数进行聚类
% 对于每个元素对不同聚类中心的隶属度,找出最大的那个隶属度
maxU = max(U); % 找出每一列的最大隶属度
temp = sort(center);
for i = :cluster_n; % 按聚类结果分割图像
% 前面求出每个元素的最大隶属度,属于各聚类中心的元素坐标,并存放这些坐标
% 调用eval函数将括号里的字符串转化为命令执行
eval(['class_',int2str(i), '= find(U(', int2str(i), ',:) == maxU);']);
%gray = round( * (i-) / (cluster_n-));
index = find(temp == center(i));
switch index
case
gray = ;
case cluster_n
gray = ;
otherwise
gray = fix(*(index-)/(cluster_n-));
end
eval(['I(class_',int2str(i), '(:))=', int2str(gray),';']);
end;
imt = mat2gray(I); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 用于计算聚类中心、隶属度矩阵和目标函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [center, U] = FCMprocess(data, cluster_num, options)
%data为聚类数据,cluster_num为类别数
m = options(); % 参数m
max_iteration = options(); % 最终的迭代次数
min_deviation = options(); % 最小判别误差
data_number = size(data, ); % 元素个数
obj_function = zeros(max_iteration, ); % obj_function用于存放目标函数的值
% 生成隶属度矩阵U
U = rand(cluster_num, data_number); % 随机生成隶属度矩阵U
sumU = sum(U,); % 计算U中每列元素和
for k = :data_number
U(:,k) = U(:,k) ./ sumU(k); % 对隶属矩阵U进行归一化处理
end for i = :max_iteration
[U, center, obj_function(i)] = FCMStep(data, U, cluster_num, m); %调用FCMStep函数进行迭代
fprintf('第%d次迭代, 目标函数值为%f\n', i, obj_function(i));
% 检查迭代终止条件
if i > ,
if abs(obj_function(i) - obj_function(i-)) < min_deviation
break;
end
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 该函数用于每次迭代过程
function [newU,center,obj_function] = FCMStep(data, U, cluster_num, m)
% data为被聚类数据,U为隶属度矩阵,cluster_num为聚类类别数,m为FCM中的参数m
% 函数调用后得到新的隶属度矩阵newU,聚类中心center,目标函数值obj_function
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 以下是计算模糊隶属度Ut
[x,y] = size(U);
A = ones(x,y);
a = 0.85;
Ut = abs(A - U -(A - (U).^a).^(/a));
Ud = U + Ut;
[j,k,l] = size(data);
pp = y;
pai = (sum(Ut,)) ./pp;
obj = sum(pai.*exp(-pai));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ud = U;
% obj = ;
nf = Ud;
mf = Ud.^m; % FMC中的U^m
% center = nf*data./((ones(size(data, ), )*sum(nf'))'); % 得到聚类中心 data1 = zeros(x,y);
data1(,:) = data';
data1(,:) = data';
data1(,:) = data';
data1(,:) = data';
% data1(,:) = data';
center = sum(nf.*data1,)./sum(nf,); % 得到聚类中心 dist = Distance(center, data); % 调用myfcmdist函数计算聚类中心与被聚类数据的距离
obj_function = sum(sum((dist.^).*mf))+obj; % 得到目标函数值
tmp = dist.^(-/(m-)); % 如果迭代次数不为1,计算新的隶属度矩阵
newU = tmp./(ones(cluster_num, )*sum(tmp)); % U_new为新的隶属度矩阵 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Distance()函数用于计算聚类中心与被聚类数据的距离
% center为聚类中心,data为被聚类数据,输出各元素到聚类中心的距离out
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out = Distance(center, data) data_number = size(data,);
class_number = size(center, );
kk = ones(data_number,); % 构造与数据大小相同的全1矩阵kk
out = zeros(class_number, data_number);
if size(center, ) > , %若类别数大于1
for k = :class_number
out(k, :) = sqrt(sum(((data - kk...
*center(k,:)).^)'));
end
else % data为一维数据
for k = :class_number
out(k, :) = abs(center(k) - data)';
end
end
图像模糊C均值聚类分割代码的更多相关文章
- 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)
这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...
- 基于核方法的模糊C均值聚类
摘要: 本文主要针对于FCM算法在很大程度上局限于处理球星星团数据的不足,引入了核方法对算法进行优化. 与许多聚类算法一样,FCM选择欧氏距离作为样本点与相应聚类中心之间的非相似性指标,致使算法趋向 ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- 5-Spark高级数据分析-第五章 基于K均值聚类的网络流量异常检测
据我们所知,有‘已知的已知’,有些事,我们知道我们知道:我们也知道,有 ‘已知的未知’,也就是说,有些事,我们现在知道我们不知道.但是,同样存在‘不知的不知’——有些事,我们不知道我们不知道. 上一章 ...
- 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例
k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...
- Python实现kMeans(k均值聚类)
Python实现kMeans(k均值聚类) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=> ...
- 多核模糊C均值聚类
摘要: 针对于单一核在处理多数据源和异构数据源方面的不足,多核方法应运而生.本文是将多核方法应用于FCM算法,并对算法做以详细介绍,进而采用MATLAB实现. 在这之前,我们已成功将核方法应用于FCM ...
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
- 图像检索(2):均值聚类-构建BoF
在图像检索时,通常首先提取图像的局部特征,这些局部特征通常有很高的维度(例如,sift是128维),有很多的冗余信息,直接利用局部特征进行检索,效率和准确度上都不是很好.这就需要重新对提取到的局部特征 ...
随机推荐
- dubbo线程池作用于接口而不是方法
记一次线上dubbo服务超时和线程池满问题排查 可能调用的接口没问题,但是该服务中的其他接口占用完了线程池,导致调用超时被拒绝处理.
- 《浏览器工作原理与实践》<08>调用栈:为什么JavaScript代码会出现栈溢出?
在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript 引擎先会对其进行编译,并创建执行上下文.但是并没有明确说明到底什么样的代码才算符合规范. 那么接下来我们就来明确下,哪些情况下代码才 ...
- ubuntu下后台服务的管理
注册后台服务后都有脚本存在/lib/systemd/system路径下 如mysql为mysql.service 被service管理的进程被杀掉还是会重启的 应使用service XXX stop停 ...
- 8种主流NoSQL数据库对比
摘要:虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只是时间问题:被迫使用关系数据库,但最终发现不能适应需求的情况不胜枚举. 简介 NoSQL,是一项全新的数据库革命 ...
- vue 项目中使用postMessage问题总结
问题描述: 由于目前做的项目分成两个项目,通过iframe嵌套,所以用到了 postMessage 当监听传过来的值的时候 出现了接受多次的问题 产生原因: 我的监听事件是放在home页 mount ...
- httprunnermanager环境搭建 -----转
转发自 https://www.cnblogs.com/tiechui2015/p/10017801.html 感谢大神 1,开源代码下载 这里的git下载地址是:https://github.c ...
- this关键词详解
当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this. 因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this ...
- P3306 [SDOI2013]随机数生成器
思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...
- mysql 常见ALTER TABLE操作
删除列 alter table table-name drop col-name; 增加列(单列) alter table table-name add col-name col-type comme ...
- 002_Python基础学习网站
(一)电脑端:Python 基础教程 (二)手机端:Python 基础教程