|
BP神经网络工具箱+Kmeans的图像分割算法:
百度网盘链接:
链接:http://pan.baidu.com/s/1kVBjVAB
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
BP_Kmeans代码如下
- %% BP网络的预测
- %% 清空环境变量
- clc,clear,close all
- warning off
- format shortG
- % 导入数据
- im = imread('lena.jpg');
- if size(im,3)>1
- im = rgb2gray(im);
- end
- if size(im,1)>256
- im = imresize(im,[256,ceil(size(im,2)/(size(im,1)/256))]);
- end
- [Row,Col] = size(im);
- %% Kmeans进行图像数据的分类---For getting train data
- Kc = 2; % 分类数量
- [ClusterData, center, center_index] = get_train_data(im, Kc);
- %% 训练数据和预测数据
- len = length(ClusterData); % 样本长度
- input_train = ClusterData(:)'; % 列方向排列样本
- % 测试样本
- im1 = imread('ysw.jpg');
- im1 = im2double( im1(:,:,1) );
- input_test = im1(:)';
- % 输出
- output_train = center_index'; % 训练
- output_test = []; % 预测的数据
- %% 网络结构初始化
- % 节点个数
- inputnum=1;
- % hiddennum=10;
- outputnum=1;
- %初始化网络结构
- nntwarn off
- % 单隐藏层
- % net=newff(input_train,output_train,hiddennum,{'logsig','logsig'},'trainlm');
- % 多隐藏层
- net=newff(input_train,output_train,[3,7],{'logsig','logsig'},'trainlm');
- net.trainParam.epochs=100;
- net.trainParam.lr=0.01;
- net.trainParam.goal=1e-16;
- net.trainParam.min_grad = 1e-16;
- net.trainParam.show=100;
- net.trainParam.showWindow=1;
- net.trainParam.max_fail=100;
- %网络训练
- [net,per]=train(net,input_train,output_train);
- %% BP网络预测
- % 训练样本--预测输出
- yc_train = sim(net,input_train);
- yc_train = round( yc_train' );
- error_train = abs(yc_train-output_train');
- disp(['训练样本均方根误差 = ',num2str(mse(error_train))])
- % 测试样本--预测输出
- yc_test = sim(net,input_test);
- % yc_test = sim(net,input_train);
- disp('预测数据如下:')
- yc_test = round( yc_test' );
- %% 测试样本分割结果
- [Row,Col] = size(im1);
- A = zeros(Row*Col, 1);
- A(find(yc_test==1), :) = 1;
- A1 = reshape(A,Row,Col); % 第1类
- A = zeros(Row*Col, 1);
- A(find(yc_test==2), :) = 1;
- A2 = reshape(A,Row,Col); % 第2类
- figure,
- subplot(121),imshow(A1,[])
- subplot(122),imshow(A2,[])
复制代码 采用kmeans算法获取训练样本数据:
- function [ClusterData, center, center_index] = get_train_data(im, Kc)
- if size(im,3)>1
- im = rgb2gray(im);
- end
- im = im2double(im);
- ClusterData = im(:);
- % 分类数
- [len, depth]= size(ClusterData);
- % Kc = 3;
- % 初始化中心
- index = ceil( unifrnd(1,len, 1, Kc) ); % 均匀分布
- center = ClusterData(index,:);
- center_new = center; % 初始化新的中心
- % maim loop
- maxgen = 1e3; % 最大迭代次数
- for i=1:maxgen
- % 计算 每一个待分类的数据隶属于的中心编号
- [center_minDist,center_index] = center_nearest(center,ClusterData);
- % 更新center
- for j=1:Kc
- index = find(center_index==j);
- center_new(j, :) = mean( ClusterData(index,:) );
- end
- error = norm( center_new-center, 2 ); % 相连两次中心点的距离值
- center = center_new; % 更新中心
- if error<0.000001
- break;
- end
- end
复制代码 聚类中心计算:
- function [minDist,index] = center_nearest(center,ClusterData)
- % ClusterData:待聚类的数据
- % center:聚类的中心
- % 函数目的:求解每一个数据隶属于的中心
- minDist = zeros(size(ClusterData,1),1);
- index = zeros(size(ClusterData,1),1);
- dist = zeros(size(center,1),1);
- for i=1:length(ClusterData)
- for j=1:size(center,1)
- dist(j) = norm(ClusterData(i,:) - center(j,:), 2);
- end
- [ minDist(i), index(i) ]= min(dist);
- end
复制代码
|
|