-

- 加为好友
- 发送私信
- 在线聊天
-
ost86
- 等级:

- 可用分等级:
- 总技术分:
- 总技术分排名:
- 揭贴率:
|
| 发表于:2008-08-08 16:05:56 楼主 |
老师让我调试一个计算两种颜色色差并给出色差级别的WINDOWS程序。 因为每次求出的值偏差比较大,所以想计算5次值并将其平均值做为最终结果显示出来。 这就涉及到要求统计计算次数,我知道MouseEventArgs.Clicks 属性可以获取按下和释放鼠标的次数,但是在程序中应该怎么应用却不懂。 其中button_compute为计算色差按钮 麻烦好心人帮忙指点下,不甚感激。 附一部分程序: //以下内容为色差评估 private void buttonPG_Click(object sender, System.EventArgs e) //选择功能为色差评估 { GBth.Enabled=false; GBth.Visible=false; GBcm.Visible=false; GBcm.Enabled=false; GBpg.Visible=true; GBpg.Enabled=true; GBfz.Visible=false; GBfz.Enabled=false; GBwl.Visible=false; GBwl.Enabled=false; } //分别获取两个颜色块的R、G、B值 private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { panel1.BackColor=mainflag.pixelColor; } private void panel2_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { panel1.BackColor=mainflag.objColor; } //将RGB值转化到计算色差所需的XYZ三刺激值空间 private void to2_XYZ(int r,int g,int b) { double[,]a=new double[3,3]{{0.2025,0.1094,0.0703},{0.1162,0.2428,0.0331},{0.0133,0.0559,0.4340}}; X=r*a[0,0]+g*a[0,1]+b*a[0,2]; Y=r*a[1,0]+g*a[1,1]+b*a[1,2]; Z=r*a[2,0]+g*a[2,1]+b*a[2,2]; } ////////////////////////////////////// private double L(double y,double y0) { double l; if ((y/y0)>0.008856) { l=116*Math.Pow(y/y0,1.0/3)-16.0; return l;} else { l=903.3*(y/y0); return l;} } private double F(double I,double I0) { double f; if ((I/I0)>0.008856) { f=Math.Pow(I/I0,1.0/3); return f;} else { f=7.787*(I/I0)+16.0/116; return f;}; } //计算色差 private void button_compute_Click(object sender, System.EventArgs e) { Color colorS,colorO; //这里边是计算公式部分了 colorS=mainflag.pixelColor; colorO=mainflag.objColor; int r1,g1,b1,r2,g2,b2; r1=colorS.R; r2=colorO.R; b1=colorS.B; b2=colorO.B; g1=colorS.G; g2=colorO.G; double X0=94.825,Y0=100.000,Z0=107.381,X1=0,X2=0,Y1=0,Y2=0,Z1=0,Z2=0,L1,L2,C1,C2,H1,H2,a1,a2,bl1,bl2; double[,]t=new double[3,4]; to2_XYZ(r1,g1,b1); X1=X;Y1=Y;Z1=Z; to2_XYZ(r2,g2,b2); X2=X;Y2=Y;Z2=Z; L1=L(Y1,Y0); L2=L(Y2,Y0); a1=500*(F(X1,X0)-F(Y1,Y0)); a2=500*(F(X2,X0)-F(Y2,Y0)); bl1=200*(F(Y1,Y0)-F(Z1,Z0)); bl2=200*(F(Y2,Y0)-F(Z2,Z0)); C1=Math.Pow(Math.Pow(a1,2)+Math.Pow(bl1,2),0.5); C2=Math.Pow(Math.Pow(a2,2)+Math.Pow(bl2,2),0.5); H1=Math.Atan(bl1/a1); H2=Math.Atan(bl2/a2); t[0,1]=L1-L2; t[0,0]=Math.Pow(Math.Pow(t[0,1],2)+Math.Pow((a2-a1),2)+Math.Pow((bl2-bl1),2),0.5); t[0,2]=C1-C2; t[0,3]=H1-H2; this.textBox11.Text=t[0,0].ToString(); this.textBox12.Text=t[0,1].ToString(); this.textBox13.Text=t[0,2].ToString(); this.textBox14.Text=t[0,3].ToString(); if(t[0,0]>11.6&&t[0,0] <=13.6) //根据计算得到的色差值所在范围来确定色差级别 this.textBox00.Text="1 级"; else if(t[0,0]>8.2&&t[0,0] <=11.6) this.textBox00.Text="1-2 级"; else if(t[0,0]>5.6&&t[0,0] <=8.2) this.textBox00.Text="2 级"; else if(t[0,0]>4.1&&t[0,0] <=5.6) this.textBox00.Text="2-3 级"; else if(t[0,0]>3&&t[0,0] <=4.1) this.textBox00.Text="3 级"; else if(t[0,0]>2.1&&t[0,0] <=3) this.textBox00.Text="3-4 级"; else if(t[0,0]>1.3&&t[0,0] <=2.1) this.textBox00.Text="4 级"; else if(t[0,0]>0.4&&t[0,0] <=1.3) this.textBox00.Text="4-5 级"; else if(t[0,0] <=0.4) this.textBox00.Text="5 级"; else this.textBox00.Text=""; } private void panel1_Click(object sender, System.EventArgs e) { mainflag.val=0; } private void panel2_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if(RB_B.Checked) { mainflag.val=1; } else if(RB_S.Checked) { cdatabase cdatabase =new cdatabase(); if(cdatabase.ShowDialog()==DialogResult.OK) panel2.BackColor=mainflag.objColor; } panel2.BackColor=mainflag.objColor; } //色差评估结束 |
|
|
|
100
修改
删除
举报
引用
回复
| |