用简单神经网络较准相机颜色

Matlab神经网络工具箱具有比较强大的训练功能,之前写过一篇关于神经网络就一些简单的数据进行训练并进行预测的文章。简单神经网络
应用的motivation是这样的:举例来说,相机因为曝光、老化等问题会将一个红色(255,0,0)识别为偏暗的红色(如上图),所以希望将真正的颜色和相机拍出来的颜色进行对应,从而期望能获得更加准确的取色效果。原理很简单,就是把图片RGB的三通道值所谓输入,把目标颜色作为输出,构建神经网络进行学习,从而比较准确的识别颜色。

首先是训练模块代码:(手打注释,难免有纰漏,还望指正)

clc
clear
%读入原始图像
original=imread('E:\Matlab\deleted\eight.jpg');

%读入输出图像
label=imread('E:\Matlab\deleted\eight_color.jpg');

%图像尺寸参数,imgwidth*imghight 对应像素值
imgwidth=1280;
imghight=480;

%将三个通道的值进行分离
sqrs=original(:,:,1);
sqjdcs=original(:,:,2);
sqglmj=original(:,:,3);

%调整三个通道的数据格式,变为 一行*n列
sqrs=reshape(sqrs,1,imgwidth*imghight);
sqjdcs=reshape(sqjdcs,1,imgwidth*imghight);
sqglmj=reshape(sqglmj,1,imgwidth*imghight);

%把unit8编码转化为double进行运算
sqrs=im2double(sqrs);
sqjdcs=im2double(sqjdcs);
sqglmj=im2double(sqglmj);

%下列输出矩阵的处理同输入
glky1=label(:,:,1);
glky2=label(:,:,2);
glky3=label(:,:,3);
glky1=reshape(glky1,1,imgwidth*imghight);
glky2=reshape(glky2,1,imgwidth*imghight);
glky3=reshape(glky3,1,imgwidth*imghight);
glky1=im2double(glky1);
glky2=im2double(glky2);
glky3=im2double(glky3);


%分别合成输入矩阵和输出矩阵
p=[sqrs;sqjdcs;sqglmj];
t=[glky1;glky2;glky3];

%进行归一化处理
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);

dx=[-1,1;-1,1;-1,1];

%确定隐藏层及对应的激励函数
net=newff(dx,[3,6,9,3],{'tansig','tansig','tansig','purelin'},'traingdx');

%训练参数设置
net.trainParam.show=1000;
net.trainParam.Lr=0.05;
net.trainParam.epochs=6000;
net.trainParam.goal=3*10^(-2);

%开始训练
net=train(net,pn,tn);

an=sim(net,pn);
a=postmnmx(an,mint,maxt);

然后是验证模块代码:

clc;
%清除下面会用到变量的重名变量,但是不能把训练模型删掉了
clear testimg t1 t2 t3 pnew pnewn anewn anew res1 res2 res3 resimage;
%image width*hight
width=1280;
hight=480;
%读入预测图片
testimg=imread('E:\Matlab\deleted\eight.jpg');
%通道分离和矩阵处理同上
t1=testimg(:,:,1);
t2=testimg(:,:,2);
t3=testimg(:,:,3);
t1=reshape(t1,1,width*hight);
t2=reshape(t2,1,width*hight);
t3=reshape(t3,1,width*hight);
t1=im2double(t1);
t2=im2double(t2);
t3=im2double(t3);
pnew=[t1;t2;t3];

%利用原有模型进行预测
pnewn=tramnmx(pnew,minp,maxp);
anewn=sim(net,pnewn);
anew = postmnmx(anewn,mint,maxt);

%将输出结果转化为图片并输出
res1=anew(1,:);
res2=anew(2,:);
res3=anew(3,:);
res1=reshape(res1,hight,width);
res2=reshape(res2,hight,width);
res3=reshape(res3,hight,width);
res1=res1.*255;
res2=res2.*255;
res3=res3.*255;
res1=uint8(res1);
res2=uint8(res2);
res3=uint8(res3);

resimage(:,:,1) = res1;
resimage(:,:,2) = res2;
resimage(:,:,3) = res3;
imshow(resimage);

下面是我利用这个模型做的效果图,因为为了快速训练出结果,所以没有设置很高的精度。
用简单神经网络较准相机颜色_第1张图片
这幅图片中,左上方是训练的输出,左下方是原图片,右侧是利用训练模型对原图片进行处理后的结果。
另外,我还找了一个和训练模型完全无关的图片进行处理,效果如下:
用简单神经网络较准相机颜色_第2张图片
对于区别比较明显的颜色,处理还是比较好的,但是对于深绿色和黑色因为精度不高,训练数据不够所以效果一般,但是毕竟是求快之作,神经网络的作用还是可以肯定的!

你可能感兴趣的:(神经网络)