2017年国赛高教杯数学建模C题颜色与物质浓度辨识解题全过程文档及程序
2017年国赛高教杯数学建模
C题 颜色与物质浓度辨识
比色法是目前常用的一种检测物质浓度的方法,即把待测物质制备成溶液后滴在特定的白色试纸表面,等其充分反应以后获得一张有颜色的试纸,再把该颜色试纸与一个标准比色卡进行对比,就可以确定待测物质的浓度档位了。由于每个人对颜色的敏感差异和观测误差,使得这一方法在精度上受到很大影响。随着照相技术和颜色分辨率的提高,希望建立颜色读数和物质浓度的数量关系,即只要输入照片中的颜色读数就能够获得待测物质的浓度。试根据附件所提供的有关颜色读数和物质浓度数据完成下列问题:
1. 附件Data1.xls中分别给出了5种物质在不同浓度下的颜色读数,讨论从这5组数据中能否确定颜色读数和物质浓度之间的关系,并给出一些准则来评价这5组数据的优劣。
2. 对附件Data2.xls中的数据,建立颜色读数和物质浓度的数学模型,并给出模型的误差分析。
3. 探讨数据量和颜色维度对模型的影响。
整体求解过程概述(摘要)
数码照片比色法一种检测物质浓度的方法,其原理是根据照片中的颜色读数来判断待测物质的浓度。本文根据所给数据的特征,采用合理的颜色读数值建立统计回归模型,对颜色读数与物质浓度之间的关系进行了细致的分析与研究。
针对问题一,首先分别做出各组数据中的RGB值与浓度的散点图,大体判断出是否采用RGB颜色模型或灰度颜色模型进行回归分析建模。如不可行,再结合数据特征,用HSV颜色模型(H值或S值)与浓度建立回归分析模型。具体回归函数可以根据各组数据变化特征进行选择。 如组胺、溴酸钾、工业碱三组数据,可以采用灰度颜色模型建立一元回归分析模型,进而确定出颜色读数与物质浓度之间的关系。对于硫酸铝钾,采用 S 值与浓度建立Michaelis-Menten 回归分析模型,也可以确定出两者之间的关系。对于奶中尿素,经过对比,最后采用RGB中的B值与浓度建立回归模型,但该组数据拟合效果相对较差。 对于数据优劣的评价,主要从数据的准确度和精密度进行分析。两者可以分别用实验测量次数和数据的标准偏差大小进行量化。通过两者的比值构造数据优劣度模型,对各组数据进行排序。最终优劣顺序为:溴酸钾、组胺、硫酸铝钾、工业碱与奶中尿素。
针对问题二,结合二氧化硫H值和浓度的变化规律,选用Michaelis-Menten模型构建回归分析方程,并对计算结果进行误差分析,删去数据异常点,进行模型改进,并做出模型预测值与原始数据的残差图。模型的预测值误差基本可以控制在10%以内。
针对问题三,首先考虑数据量对模型的影响,一般,数据量越大越好。通过删除问题一中的部分溴酸钾溶液数据,重新建立模型与问题一中结果对比,可以看出模型的拟合效果明显变差。所以数据量应结合实际情况,至少达到一定量,并尽量做到数据分布均匀,当数据间隔较大时,应对同组数据进行多次测量。 其次考虑颜色维度对模型的影响,对问题一中工业碱溶液的模型进行改进,建立灰度值,H值、S值与浓度的多元线性回归模型,可以发现拟合的效果反而变差。再建立RGB三个值、H值、S值与浓度的多元线性回归模型,则模型的效果可以得到提高。由此可以判断颜色维度对模型的影响好坏不能一概而论,要结合具体的实验数据进行讨论。
模型假设:
1、假设各组照片的拍摄环境是一致的。
2、忽略拍摄环境(距离、角度、温度)对读数的影响。
3、假设各组颜色数据的读取设备是同一台设备的。
4、假设试纸没有过期、无破损。
5、假设溶液与试纸已充分反应。
问题分析:
预备知识
数字照片比色法是一种对采集图片数字化处理的分析方法,该种方法操作简便,耗时少,成本低。其原理是根据显色溶液的特点来选择不同的颜色模型,并由分析软件得出最终结果。常用的颜色模型有RGB、灰度、HSV等[1] [2]。 RGB 颜色模型是由红、绿、蓝三基色通过颜色加权混合而成的一种模型,其每种颜色的取值范围为[0,255]。 灰度颜色模型是用0到255的不同灰度值来表示图像,0表示黑色,255表示白色,灰度模式可以由RGB模式直接转换得到。在比色法中,用灰度颜色模型对显色结果进行分析是比较简便的。 HSV颜色模型是由每一种颜色都是由色调,饱和度和明度三个变量所决定的颜色模型。其在计算机图像处理、车牌识别等领域用途较为广泛。
问题的分析
针对问题一,首先对5组数据画出RGB值与浓度的散点图,从而大体判断能否用RGB颜色模型或灰色颜色模型进行回归分析建模。如果RGB值与浓度关系不明显或拟合效果不佳,再用HSV颜色模型(H值或S值)与浓度建立回归分析模型。具体回归函数可以根据各组数据变化特征进行选择,从而建立各组颜色读数与浓度的数学模型。 对于评价数据的优劣,可以从数据的准确度和精密度进行分析。准确度主要从测量次数分析,精密度主要依靠数据的标准偏差大小进行量化。通过两者的比值构造数据优劣度模型,对各组数据进行排序。
针对问题二,首先观察二氧化硫溶液的RGB值、H值与S值与浓度变化趋势,可以发现H值与浓度变化关系最为明显,结合H值数据的变化规律,选用Michaelis-Menten模型构建回归分析方程,并对计算结果进行误差分析,筛选掉数据异常点,建立更精确的回归模型。并给出预测值与原始数据的残差图,模型预测值的误差基本控制在10%以内。
针对问题三,首先考虑数据量对模型的影响,单纯从建模需要来讲,样本容量肯定是越大越好。若删除问题一中的部分溴酸钾溶液数据,重新建立模型,可以得到模型的拟合效果明显变差。因此,根据实验要求不同,数据量至少达到一定量,并尽量做到数据分布均匀,当数据间隔较大时,可对同组数据进行多次测量。 其次考虑颜色维度对模型的影响,对问题一中工业碱溶液的模型进行改进,结合数据特征,将灰度颜色模型,与H值、S值一起建立多元线性回归模型,发现拟合的效果反而变差。再将RGB三个值、H值、S值一起建立多元线性回归模型,则模型的效果可以得到提高。由此可以判断颜色维度对模型的影响好坏不能一概而论,要结合具体的实验数据进行讨论。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
图5-1程序
clc,clear;
load za.txt;
B=za(:,1);B=B';
G=za(:,2);G=G';
R=za(:,3);R=R';
H=za(:,4);H=H';
S=za(:,5);S=S';
y=za(:,6);y=y';
plot(y,R,'r+',y,G,'G*',y,B,'bo')
表5-2程序
clc,clear;
L=[76;74;91;92;101;101;103;102;109;108];
y=[100;100;50;50;25;25;12.5;12.5;0;0];
x=[ones(10,1),L];
[b,bint,r,rint,stats]=regress(y,x)
图5-2程序
clc,clear;
load xsj.txt;
B=xsj(:,1);B=B';
G=xsj(:,2);G=G';
R=xsj(:,3);R=R';
H=xsj(:,4);H=H';
S=xsj(:,5);S=S';
y=xsj(:,6);y=y';
plot(y,R,'r+',y,G,'G*',y,B,'bo')
表5-4程序
L=[122;122;127;127;131;132;135;135;141;140];
y=[100;100;50;50;25;25;12.5;12.5;0;0];
x=[ones(10,1),L];
[b,bint,r,rint,stats]=regress(y,x)
表5-5程序
L=[122;122;127;127;131;132;135;135;141;140];
y=[100;100;50;50;25;25;12.5;12.5;0;0];
for(i=1:10)
lt(i,1)=L(i,1)*L(i,1);
end
x=[ones(10,1),lt,L];
[b,bint,r,rint,stats]=regress(y,x)
图5-3程序
clc,clear;
load gyj.txt;
B=gyj(:,1);B=B';
G=gyj(:,2);G=G';
R=gyj(:,3);R=R';
H=gyj(:,4);H=H';
S=gyj(:,5);S=S';
y=gyj(:,6);y=y';
plot(y,R,'r+',y,G,'G*',y,B,'bo')
表5-7程序
clc,clear;
L=[41 62 104 130 140 139
140];
y=[11.8 10.18 9.19 8.74 8.14 7.34 0];
x=[ones(7,1),L'];
[b,bint,r,rint,stats]=regress(y',x)
rcoplot(r,rint)
表5-8程序
clc,clear;
L=[41 62 104 130 140 139 ];
y=[11.8 10.18 9.19 8.74 8.14 7.34 ];
x=[ones(6,1),L'];
[b,bint,r,rint,stats]=regress(y',x)
图5-5程序
clc,clear;
load lslj.txt;
B=lslj(:,1);B=B';
G=lslj(:,2);G=G';
R=lslj(:,3);R=R';
H=lslj(:,4);H=H';
S=lslj(:,5);S=S';
y=lslj(:,6);y=y';
plot(y,R,'r+',y,G,'G*',y,B,'bo')
图5-6程序
clc,clear;
load llsj.txt;
B=llsj(:,1);B=B';
G=llsj(:,2);G=G';
R=llsj(:,3);R=R';
H=llsj(:,4);H=H';
S=llsj(:,5);S=S';
L=llsj(:,6);L=L';
y=llsj(:,7);y=y';
plot(y,H,'*')
clc,clear;
load llsj.txt;
B=llsj(:,1);B=B';
G=llsj(:,2);G=G';
R=llsj(:,3);R=R';
H=llsj(:,4);H=H';
S=llsj(:,5);S=S';
L=llsj(:,6);L=L';
y=llsj(:,7);y=y';
plot(y,S,'o')
图5-8程序
clc,clear;
load llsj.txt;
B=llsj(:,1);B=B';
G=llsj(:,2);G=G';
R=llsj(:,3);R=R';
H=llsj(:,4);H=H';
S=llsj(:,5);S=S';
L=llsj(:,6);L=L';
y=llsj(:,7);y=y';
x=[ones(37,1),H'];
[b,bint,r,rint,stats]=regress(y',x)
%————————分析S————————————
[beta0]=[-6.5071 0.0847];
[beta,R,J]=nlinfit(y,S,'huaxue',beta0);
betaci=nlparci(beta,R,J);
beta,betaci
ss=beta(1)*y./(beta(2)+y);
yy=(ss*0.19)./(200.90-ss);
y1=y-yy;
plot(S,y1,'o');
nlintool(y,S,'huaxue',beta);
%————————分析h————————————
[beta0]=[-6.5071 0.0847];
[beta,R,J]=nlinfit(y,H,'huaxue',beta0);
betaci=nlparci(beta,R,J);
beta,betaci
hh=beta(1)*y./(beta(2)+y);yy=S./2;
plot(y,H,'o',y,yy,'*'),pause
nlintool(y,H,'huaxue',beta)
图5-9程序
clc,clear;
load nzns.txt;
B=nzns(:,1);B=B';
G=nzns(:,2);G=G';
R=nzns(:,3);R=R';
H=nzns(:,4);H=H';
S=nzns(:,5);S=S';
y=nzns(:,6);y=y';
plot(y,R,'r+',y,G,'g*',y,B,'bo')
表5-10 程序
B=[105 108 107 107 110 105 112 108 111 117 114 119 125 120 118];
G=[136 140 135 136 136 134 132 136 139 137 134 140 135 136 136];
R=[137 142 138 139 139 138 134 138 142 139 138 142 140 138 139];
H=[28 28 26 26 26 26 27 28 27 27 25 26 20 26 25];
S=[58
60 57 58 52 60 42 54 55 41 44 40 27 33 37];
L=[133 137 133 134 134 132 130 133 137 135 133 138 135 135 135];
y=[2000 2000
2000
0];
x=[ones(15,1),L'];
1500
[b,bint,r,rint,stats]=regress(y',x)
图5-10(a)程序
clc,clear;
load nzns.txt;
B=nzns(:,1);B=B';
G=nzns(:,2);G=G';
R=nzns(:,3);R=R';
H=nzns(:,4);H=H';
S=nzns(:,5);S=S';
y=nzns(:,6);y=y';
plot(y,H,'r*')
图5-10(b)程序
clc,clear;
load nzns.txt;
B=nzns(:,1);B=B';
G=nzns(:,2);G=G';
R=nzns(:,3);R=R';
H=nzns(:,4);H=H';
S=nzns(:,5);S=S';
y=nzns(:,6);y=y';
plot(y,S,'bo')
表5-11 程序
clc,clear;
1500
1500
1000
1000
500 500 500 5 0 0
B=[105 108 107 107 110 105 112 108 111 117 114 119 125 120 118];
G=[136 140 135 136 136 134 132 136 139 137 134 140 135 136 136];
R=[137 142 138 139 139 138 134 138 142 139 138 142 140 138 139];
H=[28 28 26 26 26 26 27 28 27 27 25 26 20 26 25];
S=[58 60 57 58 52 60 42 54 55 41 44 40 27 33 37];
L=[133 137 133 134 134 132 130 133 137 135 133 138 135 135 135];
y=[2000 2000 2000 1500 1500 1500 1000 1000 500 500 500 5 0 0 0];
x=[ones(15,1),S'];
[b,bint,r,rint,stats]=regress(y',x)