用简单神经网络准确识别颜色

匿名 (未验证) 提交于 2019-12-03 00:29:01

Matlab神经网络工具箱具有比较强大的训练功能,之前写过一篇关于神经网络就一些简单的数据进行训练并进行预测的文章。简单神经网络
最近因为需要,拓展出来了关于颜色识别的功能。原理很简单,就是把图片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);

下面是我利用这个模型做的效果图,因为为了快速训练出结果,所以没有设置很高的精度。

这幅图片中,左上方是训练的输出,左下方是原图片,右侧是利用训练模型对原图片进行处理后的结果。
另外,我还找了一个和训练模型完全无关的图片进行处理,效果如下:

对于区别比较明显的颜色,处理还是比较好的,但是对于深绿色和黑色因为精度不高,训练数据不够所以效果一般,但是毕竟是求快之作,神经网络的作用还是可以肯定的!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!