| 
 | 
 
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
 
  复制代码 
 
 
 
 
 
 
 
 
 
 
 
 |   
 
 
 
 |