java traingdx函数实现_提取伪彩色图像的信息

本文介绍了如何使用神经网络,特别是BP神经网络和RBF神经网络,从伪彩色图像中提取灰度值信息。通过训练样本,神经网络可以预测伪彩色图中的灰度值,实现信息提取。
摘要由CSDN通过智能技术生成

由于人眼对彩色比较敏感,所以灰度图像常常使用伪彩色来显示,方便人眼对重要特征的识别,如下图

load flujet

image(X)

colormap(jet)

colormap(gray)

a4c26d1e5885305701be709a3d33442f.pnga4c26d1e5885305701be709a3d33442f.png

同样一幅灰度图,伪彩色和灰度展示给人的信息是不一样的,明显从伪彩色图中能看到更多信息。

而有时候需要从已得的伪彩色图中提取灰度值信息,这貌似没有专门的函数实现,需要自己根据灰度转伪彩色的过程逆向实现,但灰度转伪彩色根据不同的伪彩色类型又有不同的算法,这就麻烦了。而且即使知道了算法,伪彩色图可能受到了加亮处理或者其他,使转化规律又变了,这就更麻烦了...

想到可以用神经网络等一些智能算法来实现,如下图为一个伪彩色图,需要提取其实际灰度信息

a4c26d1e5885305701be709a3d33442f.png

这张图很好,右边正好有个伪彩色与灰度的对应关系图,所以根据此信息就可以推断原图中相应的彩色的灰度值。所以用神经网络的思路就很清楚了,利用右边的颜色条构造训练样本,训练神经网络后,用其对原图中的彩色值作为输入得到网络的预测输出,从而得到灰度值。

这里正好复习一下神经网络的matlab用法,使用了BP神经网络和RBF神经网络。

BP神经网络

BP神经网络属于前向网络。以下为创建BP神经网络的方法及参数意义

(1)net=newff(P,T,S)或者net =

newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)

P:输入参数矩阵。(RxQ1)

T:目标参数矩阵。(SNxQ2)

S:N-1个隐含层的数目(S(i)到S(N-1)),输出层的单元数目取决于T,默认为空矩阵。

TF:相关层的传递函数,默认隐含层为tansig函数,输出层为purelin函数。

BTF:BP神经网络学习训练函数,默认值为trainlm函数。

BLF:权重学习函数,默认值为learngdm。

PF:性能函数,默认值为mse。

IPF,OPF,DDF均为默认值即可。

(2)传递函数

purelin 线性传递函数

tansig 正切 S 型传递函数

logsig 对数 S 型传递函数

隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点转移函数选用

tansig函数或logsig函数,输出层节点转移函数选用tansig函数或purelin函数。

(3)学习训练函数

神经网络的学习分为有导师学习和无导师学习。

最速下降BP算法:traingd

动量BP算法:traingdm

学习率可变的BP算法:trainda(学习率可变的最速下降BP算法);traindx(学习率可变的动量BP算法)

弹性算法:trainrp

变梯度算法:traincgf(Fletcher-Reeves修正算法)

traincgp(Polak_Ribiere修正算法)

traincgb(Powell-Beale复位算法)

trainbfg(BFGS 拟牛顿算法)

trainoss(OSS算法)

trainlm(LM算法)

参数说明:通过net.trainParam可以查看参数

Show

Training Window Feedback showWindow: true

Show

Command Line Feedback showCommandLine: false

Command

Line

Frequency show: 两次显示之间的训练次数

Maximum

Epochs epochs: 训练次数

Maximum

Training

Time time: 最长训练时间(秒)

Performance

Goal goal: 网络性能目标

Minimum

Gradient min_grad: 性能函数最小梯度

Maximum

Validation

Checks max_fail: 最大验证失败次数

Learning

Rate lr: 学习速率

Learning

Rate

Increase lr_inc: 学习速率增长值

Learning

Rate lr_dec: 学习速率下降值

Maximum

Performance Increase max_perf_inc:

Momentum

Constant mc: 动量因子

(4)BP神经网络预测函数

SimOut = sim('model', Parameters)

& y=sim(net,x)

函数功能:用训练好的BP神经网络预测函数输出

net:训练好的网络

x:输入数据

y:网络预测数据

(5)训练函数

[net,tr] = train(Net,P,T,Pi,Ai)

其中,

Net 待训练的网络

P 输入数据矩阵

T 输出数据矩阵

(default = zeros)

Pi 初始化输入层条件 (default =

zeros)

Ai 初始化输出层条件 (default =

zeros)

net 训练好的网络

tr 训练过程记录

注意:P Ni-by-TS cell

array Each element P{i,j,ts} is

an Ni-by-Q matrix.

T Nl-by-TS cell

array Each element T{i,ts} is a

Ui-by-Q matrix.

BP网络的常用函数表

函数类型

函数名称

函数用途

前向网络创建函数

newcf

创建级联前向网络

Newff

创建前向BP网络

传递函数

logsig

S型的对数函数

tansig

S型的正切函数

purelin

纯线性函数

学习函数

learngd

基于梯度下降法的学习函数

learngdm

梯度下降动量学习函数

性能函数

mse

均方误差函数

msereg

均方误差规范化函数

显示函数

plotperf

绘制网络的性能

plotes

绘制一个单独神经元的误差曲面

plotep

绘制权值和阈值在误差曲面上的位置

errsurf

计算单个神经元的误差曲面

范例:

现给出一药品商店一年当中12个月的药品销售量(单位:箱)如下:

2056 2395 2600 2298 1634 1600 1873 1487 1900 1500 2046 1556

训练一个BP网络,用当前的所有数据预测下一个月的药品销售量。

我们用前三个月的销售量预测下一个月的销售量,也就是用1-3月的销售量预测第4个月的销售量,用2-4个月的销售量预测第5个月的销售量,如此循环下去,直到用9-11月预测12月份的销售量。这样训练BP神经网络后,就可以用10-12月的数据预测来年一月的销售量。

原文中提供了一个计算的程序,这里稍作整理,如下

% 训练数据

P =[2056 2395 2600; % 一行为一个样本

2395 2600

2298;

2600 2298

1634;

2298 1634

1600;

1634 1600

1873;

1600 1873

1478;

1873 1478

1900;

1478 1900

1500;

1900 1500

2046;]; % 样本量*输入层节点数

P = P'; % 网络的输入要转置一下,这样,列向量为一个样本

T = [2298 1634 1600 1873 1487 1900 1500 2046 1556]; %

输出层节点数*输出样本数

% 训练数据归一化

[Pnorm, PPs] = mapminmax(P);

[Tnorm, TPs] = mapminmax(T);

% 建网络

HideLayerNode = [3

7]; % 隐藏层数及其个数

HideLayerTF = {'tansig' 'logsig' 'purelin'}; %

隐藏层及输出层传递函数

TrainFcn = 'traingdx'; % 学习训练函数

net = newff(Pnorm, Tnorm, HideLayerNode, HideLayerTF,

TrainFcn);

% 训练

net.trainParam.epochs =

10000; % 训练次数

net.trainParam.goal =

1e-4; % 训练目标

net.trainParam.lr =

0.01; %学习速率

for i = 1:10

net =

train(net,Pnorm,Tnorm); %

多训练几次,还可以加噪声训练

end

% 仿真

testP = [1500 2046 1556]';

testPnorm = mapminmax('apply', testP, PPs);

testTnorm = sim(net, testPnorm);

testT = mapminmax('reverse', testTnorm, TPs)

训练过程如下

a4c26d1e5885305701be709a3d33442f.png

以上过程提供了一个最简单的使用BP网络的程序,参考价值很高哦!

参考上面的代码,实现伪彩色到灰度的转化程序如下

% 使用BP神经网络对数据进行预测

clc

clear all

close all

% 加载数据

load testdata TestInput

load traindata TrainInput TrainOutput

AllP = [TrainInput; TestInput]'; % 一列为一个样本

[AllPnorm, PPs] = mapminmax(AllP);

T = TrainOutput';

[Tnorm, TPs] = mapminmax(T);

Pnorm = AllPnorm(:, 1:size(T, 2));

TestPnorm = AllPnorm(:, size(T, 2)+1:end);

% 建网络

HideLayerNode =

10; % 隐藏层数及其个数

HideLayerTF = {'tansig' 'tansig'}; %

隐藏层及输出层传递函数

TrainFcn =

'traingdx'; % 学习训练函数

net = newff(Pnorm, Tnorm, HideLayerNode, HideLayerTF,

TrainFcn);

% 训练

net.trainParam.epochs =

10000; % 训练次数

net.trainParam.goal =

1e-6; % 训练目标

net.trainParam.lr =

0.01; % 学习速率

for i = 1:10

net =

train(net,Pnorm,Tnorm); %

多训练几次,还可以加噪声训练

end

% 仿真

TestTnorm = sim(net, TestPnorm);

TestT = mapminmax('reverse', TestTnorm, TPs);

TestOutput = TestT;

save simdata TestOutput

% 计算误差

TestTnorm = sim(net, Pnorm);

figure

plot([TestTnorm-Tnorm; Tnorm]')

max(TestTnorm-Tnorm)

mean(TestTnorm-Tnorm)

a4c26d1e5885305701be709a3d33442f.png

训练的误差如上图,还可以接受吧!用上面的网络就可以预测原始灰度值,效果还是不错的。

RBF神经网络

RBF径向基神经网络是一个有很强非线性预测功能的网络,其本质就是将数据从一个空间映射到另一个空间。这个网络在matlab中使用也很方便。闲话少说,直接上代码

% 2.1.使用RBF神经网络对数据进行预测

clc

clear all

close all

% 加载数据

load testdata TestInput

load traindata TrainInput TrainOutput

AllP = [TrainInput; TestInput]'; % 一列为一个样本

[AllPnorm, PPs] = mapminmax(AllP);

T = TrainOutput';

[Tnorm, TPs] = mapminmax(T);

Pnorm = AllPnorm(:, 1:size(T, 2));

TestPnorm = AllPnorm(:, size(T, 2)+1:end);

% 建网络

net = newrbe(Pnorm, Tnorm); % exaxt型

% net = newrb(Pnorm, Tnorm, 1e-4); % app型

% 仿真及误差

TestTnorm = sim(net, Pnorm);

figure

plot([TestTnorm-Tnorm; Tnorm]')

max(TestTnorm-Tnorm)

mean(TestTnorm-Tnorm)

% 仿真及误差

TestTnorm = sim(net, TestPnorm(:, 1:10000));

TestT = mapminmax('reverse', TestTnorm, TPs);

TestOutput = TestT;

save simdata_RBF TestOutput

a4c26d1e5885305701be709a3d33442f.png

计算时间短,效果还很好,赞!

听说SVM是一个更牛的智能算法,有时间尝试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值