3986.net
小网站 大容量 大智慧
赞助商链接
当前位置:首页 >> 计算机软件及应用 >>

fcm方法进行图像分割源程序


1.myfcm 函数 function [center, U, obj_fcn] = myfcm(data, cluster_n, options) %data 为聚类数据,cluster_n 为类别数 %判断函数参数个数 if nargin ~= 2 & nargin ~= 3, error('参数太多或太少'); end data_n = size(data, 1); %data 第一维大小 in_n = size(data, 2); %data 第二维大小 % 可以改变下列数据设置默认的 options 参数 default_options = [2; % FCM 中的参数 m 100; % 最大迭代次数 1e-5; % 判别误差 epsonal 1]; % 迭代过程中显示 if nargin == 2, options = default_options; else % 如果"options" 没有完全指定,则以 default_options 中的部分进行补充 if length(options) < 4, tmp = default_options; tmp(1:length(options)) = options; options = tmp; end % 如果 options 中的一些参数不是数字,则以 default_options 中的代替 nan_index = find(isnan(options)==1); %找到 options 中的非数字元素下标 options(nan_index) = default_options(nan_index); if options(1) <= 1 error('FCM 中参数 m 应大于 1!'); end end expo = options(1); % expo 存放参数 m max_iter = options(2); % 最大迭代次数 min_impro = options(3); % 判别误差 display = options(4); % 迭代过程是否显示 obj_fcn = zeros(max_iter, 1); % obj_fcn 为目标函数值数组 U = myfcminit (cluster_n, data_n); %调用 myfcminit 函数初始化隶属度矩阵 U

for i = 1:max_iter [U, center, obj_fcn(i)] = myfcmstep(data, U, cluster_n, expo); %调用 myfcmstep 函数进行一

次迭代 if display==1 fprintf('迭代次数 = %d, obj. fcn = %f\n', i, obj_fcn(i)); end % 检查迭代终止条件 if i > 1, if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro break; end end end iter_n = i; % iter_n 为实际迭代次数 obj_fcn(iter_n+1:max_iter) = [];

2.myfcminit 函数,用于对隶属度矩阵进行初始化 function U = myfcminit (cluster_n, data_n) % % U 为隶属度矩阵,大小为:类别数*被聚类数据元素个数 %参数 cluster_n 为聚类类别数 %data_n 为被聚类数据的元素个数 % U = rand(cluster_n, data_n); %随机生成隶属度矩阵 U col_sum = sum(U);%计算 U 中每列元素和 U = U./col_sum(ones(cluster_n, 1), :); %保证 U 中每列的隶属度值之和为 1 3. myfcmstep 函数用于聚类过程中的每次迭代 function [U_new, center, obj_fcn] = myfcmstep (data, U, cluster_n, expo) % % data 为被聚类数据,U 为隶属度矩阵,cluster_n 为聚类类别数,expo 为 FCM 中的参数 m % 函数调用后得到新的隶属度矩阵 U_new,聚类中心 center,目标函数值 obj_fcn % mf = U.^expo; % FMC 中的 U^m center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 得到聚类中心 dist = myfcmdist (center, data); % 调用 myfcmdist 函数计算聚类中心与被聚类数据的 距离 obj_fcn = sum(sum((dist.^2).*mf)); % 得到目标函数值 tmp = dist.^(-2/(expo-1)); % 如果迭代次数不为 1,计算新的隶属度矩阵 U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % U_new 为新的隶属度矩阵 4.myfcmdist 函数用于计算聚类中心与被聚类数据的距离

function out =myfcmdist (center, data) % % center 为聚类中心,data 为被聚类数据 % out = zeros(size(center, 1), size(data, 1)); if size(center, 2) > 1, %若聚类中心数据大于 1,即聚类类别>=2 for k = 1:size(center, 1), out(k, :) = sqrt(sum(((data-ones(size(data, 1), 1)*center(k, :)).^2)')); end else % data 为一维数据 for k = 1:size(center, 1), out(k, :) = abs(center(k)-data)'; end end 5.fcmapp 函数实现聚类分割图像 function myfcmseg(file, cluster_n) % file: 图像文件. % cluster_n: 聚类类别数. eval(['info=imfinfo(''',file, ''');']); %获取文件信息 switch info.ColorType case 'truecolor' %真彩色图像 eval(['RGB=imread(''',file, ''');']); I = rgb2gray(RGB); clear RGB; case 'indexed' %索引图像 eval(['[X, map]=imread(''',file, ''');']); I = ind2gray(X, map); clear X; case 'grayscale' %灰度图像 eval(['I=imread(''',file, ''');']); end; I = im2double(I); filename = file(1 : find(file=='.')-1); %获取主文件名 data = reshape(I, numel(I), 1); %将图像数据转为一列数据 tic %计时开始 options=[2; % FCM 中的参数 m 100; % 最大迭代次数 1e-5; % 判别误差 epsonal 1]; [center, U, obj_fcn]=myfcm(data, cluster_n,options); %调用 myfcm 函数进行聚类 elapsedtime = toc; %聚类结束,计时结束,elapsedtime 为进行聚类,所花时间 %聚类所获得数据保存在 filename.mat 文件中

%eval(['save(', filename, int2str(cluster_n),'.mat'', ''center'', ''U'', ''obj_fcn'', ''elapsedtime'');']); %fprintf('聚类耗时 = %d', elapsedtime); maxU=max(U); temp = sort(center); for n = 1:cluster_n; %按聚类结果分割图像 eval(['cluster',int2str(n), '_index = find(U(', int2str(n), ',:) == maxU);']); index = find(temp == center(n)); switch index case 1 color_class = 0; case cluster_n color_class = 255; otherwise color_class = fix(255*(index-1)/(cluster_n-1)); end eval(['I(cluster',int2str(n), '_index(:))=', int2str(color_class),';']); end; I = mat2gray(I); %eval(['imwrite(I,', filename,'_seg', int2str(cluster_n), '.bmp'');']); %保存生成的分割图像 imshow(I);%显示生成的分割的图像



推荐相关:

汇编语言源程序的编辑、汇编、连接的方法

汇编语言源程序的编辑、汇编、连接的方法_工学_高等教育_教育专区。四川大学汇编语言源程序的编辑、汇编、连接的方法一、编辑源程序汇编语言源程序:用汇编语句编写...


LR 分析方法程序设计原理与实现技术实验报告及源代码 ...

LR 分析方法程序设计原理与实现技术 XXX 1028XXX 计科 1XXX 班 1. 程序功能描述 ` 通过设计、编写和构造LR(0)项目集规范簇和LR 分析表、对给定的符号串进行...


现代设计一维优化方法——黄金分割法c程序源代码

该程序是现代设计优化方法,黄金分割 c 语言源代码 该程序无错误,已经调试,后面附有实例, 该程序无错误,已经调试,后面附有实例,仅供参考 希望对你有所帮助…...


程序阅读方法和技巧

程序阅读方法和技巧_计算机软件及应用_IT/计算机_专业资料。第一章:导论 1. ...21.有时, 要想了解程序在某一方面的功能, 运行它可能比阅读源代码更为恰当. ...


条纹图像的特征检测方法与程序设计

实验报告七实验名称:条纹图像的特征检测方法程序设计 课程:图像检测与处理 专业:测控技术与仪器 实验日期:2015 年 12 月 4 日 1、实验目的 通过图像处理算法...


两个matlab实现最大熵法图像分割程序

两个matlab实现最大熵法图像分割程序_计算机软件及应用_IT/计算机_专业资料。实现...(递推方法) %%%%%%%%%%% clear all; clc; tic a=imread('trial2_2....


计算方法及程序实现

计算方法程序实现_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档计算方法程序实现_计算机软件及应用_IT/计算机_专业资料。一、对分...


危险源辨识的程序及方法

危险源辨识的程序方法_能源/化工_工程科技_专业资料。危险源的辨识程序及评价标准危险源辨识及风险评价方法 1.1 成立危险源辨识及风险评价小组 1.1.1 公司危险...


检验方法确认程序

检验方法确认程序_临床医学_医药卫生_专业资料。检验科项目方法学确认验证过程检验方法确认程序一.目的:适应医学技术发展,确保检验方法准确可靠,以满足临床需要。 二...


程序设计方法包括三个基本步骤—— 个人的编程体会

当使用自上而下的设计方法时, 你要把程序分割成几段来完成。列出每段要实现...对于源程序, 你应包含注释方式的文件编制, 以描述程序各个部分做何种工作。此外...

网站首页 | 网站地图
3986 3986.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com