예제 #1
0
        private static void saveCacuResultAsText(string path, double[] bavg, double[] bvar, double[] oavg, double[] ovar, double[] OBavg, double[] OBvar)
        {
            CacuProBar progressForm = new CacuProBar("写入txt", 0, bavg.Length); //计算进度

            progressForm.Show();
            int i = 0;//记录行号

            using (FileStream fs = File.Create(path)) {
                AddText(fs,
                        String.Format("{0,3}", "行号") +
                        String.Format("{0,11}", "背景均值") +
                        String.Format("{0,11}", "背景方差") +
                        String.Format("{0,11}", "地物均值") +
                        String.Format("{0,11}", "地物方差") +
                        String.Format("{0,11}", "混合均值") +
                        String.Format("{0,11}", "混合方差")
                        );
                AddText(fs, " \r\n");
                for (int x = 0; x < bavg.GetLength(0); x++)
                {
                    progressForm.SetProgressValue(x);
                    AddText(fs,
                            String.Format("{0,3}", i++) + "   " +
                            String.Format("{0,12:F3}", bavg[x]) + "   " +
                            String.Format("{0,12:F3}", bvar[x]) + "   " +
                            String.Format("{0,12:F3}", oavg[x]) + "   " +
                            String.Format("{0,12:F3}", ovar[x]) + "   " +
                            String.Format("{0,12:F3}", OBavg[x]) + "   " +
                            String.Format("{0,12:F3}", OBvar[x]));
                    AddText(fs, " \r\n");
                }
                progressForm.Close();
            }
        }
예제 #2
0
        private void VarCal_Click(object sender, EventArgs e)
        {
            if (tBoxImportData.Text == "" || tBoxExportResult.Text == "")
            {
                MessageBox.Show("请输入完整的参数和存储路径!", "逐行提取对象大小");
                return;                                                       //退出函数
            }
            Bitmap         image     = new Bitmap(tBoxImportData.Text, true); //读入图片
            InterpreProBar iterprePB = new InterpreProBar(0, image.Width);    //数据解析进度

            int[,] idata = BinMap(image, iterprePB);                          // 二值化

            //提取每行的元素 计算:地物和背景的均值/方差    地物均值/方差   背景均值/方差
            double[] bavg = new double[image.Height];//存储每行背景的均值
            double[] oavg = new double[image.Height];

            double[] bvar = new double[image.Height];//存储每行背景的方差
            double[] ovar = new double[image.Height];

            double[] OBvar = new double[image.Height];    //存储每行的方差
            double[] OBavg = new double[image.Height];    //存储每行的均值

            double[] cyclevar = new double[image.Height]; //存储每行的方差
            double[] cycleavg = new double[image.Height]; //存储每行的均值


            CacuProBar progressForm = new CacuProBar("逐行方差均值计算", 0, image.Height); //计算进度

            progressForm.Show();                                                   //开始显示计算进度

            for (int i = 0; i < image.Height; i++)                                 //逐行计算
            {
                progressForm.SetProgressValue(i);
                int[]  obasize = objBacSizeLine(i, idata);
                int    bcnt = 0, ocnt = 0;
                double bsum = 0; double osum = 0; double OBsum = 0;
                //分别计算地物和背景的方差均值
                for (int j = 0; j < obasize.Length; j++)
                {
                    OBsum += obasize[j];
                    if (idata[0, i] == 0)  //如果第一个是背景 0    010101010
                    {
                        if (j % 2 == 0)    //偶数下标就是背景bac长度
                        {
                            bsum += obasize[j];
                            bcnt++;
                        }
                        else                //奇数数下标就是地物obj长度
                        {
                            osum += obasize[j];
                            ocnt++;
                        }
                    }
                    else                   //如果第一个是背景 1    101010101
                    {
                        if (j % 2 == 0)    //偶数下标就是地物obj长度
                        {
                            osum += obasize[j];
                            ocnt++;
                        }
                        else
                        {
                            bsum += obasize[j];
                            bcnt++;
                        }
                    }
                }
                progressForm.Close();
                OBavg[i] = OBsum / (bcnt + ocnt);
                bavg[i]  = bsum / bcnt;
                oavg[i]  = osum / ocnt;

                double os  = 0; //obj均值与数组元素值得差的平方和
                double bs  = 0; //bac均值与数组元素值得差的平方和
                double OBs = 0; //bac均值与数组元素值得差的平方和

                //计算地物和背景的方差
                for (int j = 0; j < obasize.Length; j++)
                {
                    OBs += Math.Pow(obasize[j] - OBavg[i], 2);
                    if (idata[0, i] == 0)  //如果第一个是背景 0
                    {
                        if (j % 2 == 0)
                        {
                            bs += Math.Pow(obasize[j] - bavg[i], 2);
                        }
                        else
                        {
                            os += Math.Pow(obasize[j] - oavg[i], 2);
                        }
                    }
                    else                  ////如果第一个是地物 1
                    {
                        if (j % 2 == 0)
                        {
                            os += Math.Pow(obasize[j] - oavg[i], 2);
                        }
                        else
                        {
                            bs += Math.Pow(obasize[j] - bavg[i], 2);
                        }
                    }
                }
                OBvar[i] = OBs / (bcnt + ocnt);
                bvar[i]  = bs / bcnt;
                ovar[i]  = os / ocnt;

                //计算黑白周期长度的均值和方差
                for (int j = 0; j < obasize.Length; j++)
                {
                    if (idata[0, i] == 0)  //如果第一个是背景 0
                    {
                        if (j % 2 == 0)
                        {
                            bs += Math.Pow(obasize[j] - bavg[i], 2);
                        }
                        else
                        {
                            os += Math.Pow(obasize[j] - oavg[i], 2);
                        }
                    }
                    else                  ////如果第一个是地物 1
                    {
                        if (j % 2 == 0)
                        {
                            os += Math.Pow(obasize[j] - oavg[i], 2);
                        }
                        else
                        {
                            bs += Math.Pow(obasize[j] - bavg[i], 2);
                        }
                    }
                }
            }
            String str = tBoxExportResult.Text;

            //写出计算结果
            if (str.Substring(str.LastIndexOf('.'), 3 + 1) == ".txt")//包头不包尾
            {
                saveCacuResultAsText(tBoxExportResult.Text, bavg, bvar, oavg, ovar, OBavg, OBvar);
            }
            else
            {
                saveCacuResultAsExcel(tBoxExportResult.Text, bavg, bvar, oavg, ovar, OBavg, OBvar);
            }

            MessageBox.Show("OK,计算和保存完成!", "逐行提取对象大小");
            this.Dispose();
        }
예제 #3
0
        private void saveCacuResultAsExcel(string path, double[] bavg, double[] bvar, double[] oavg, double[] ovar, double[] OBavg, double[] OBvar)
        {
            CacuProBar progressForm = new CacuProBar("写入excel", 0, bavg.Length); //计算进度

            progressForm.Show();
            MSExcel.Application excelApp;              //Excel 应用程序变量
            MSExcel.Workbook    excelDoc;              //Excel文档变量

            excelApp = new MSExcel.ApplicationClass(); //初始化
            if (File.Exists(path))
            {
                File.Delete(path);
            }

            //由于使用的是COM库,因此许多变量需要用misspara代替
            Object misspara = Missing.Value;

            excelDoc = excelApp.Workbooks.Add(misspara);
            //使用第一个工作表作为插入数据的工作表
            MSExcel.Worksheet ws = (MSExcel.Worksheet)excelDoc.Sheets[1];

            //声明一个MSExcel.Range类型的变量r
            MSExcel.Range r1, r2, r3, r4, r5, r6, r7;
            r1 = ws.get_Range("A2", "A2"); //获取A2处的表格,并赋值
            r2 = ws.get_Range("B2", "B2"); //获取A2处的表格,并赋值
            r3 = ws.get_Range("C2", "C2"); //获取A2处的表格,并赋值
            r4 = ws.get_Range("D2", "D2"); //获取A2处的表格,并赋值
            r5 = ws.get_Range("E2", "E2"); //获取A2处的表格,并赋值
            r6 = ws.get_Range("F2", "F2"); //获取A2处的表格,并赋值
            r7 = ws.get_Range("G2", "G2"); //获取A2处的表格,并赋值

            r1.Value2 = "行号";
            r2.Value2 = "背景均值";
            r3.Value2 = "背景方差";
            r4.Value2 = "地物均值";
            r5.Value2 = "地物方差";
            r6.Value2 = "混合均值";
            r7.Value2 = "混合方差 ";

            for (int i = 3; i < bavg.Length + 3; i++)  //行  , , ,
            {
                progressForm.SetProgressValue(i);
                ws.Cells[i, 1] = (i - 3).ToString();//行号
                ws.Cells[i, 2] = String.Format("{0,12:F3}", bavg[i - 3]);
                ws.Cells[i, 3] = String.Format("{0,12:F3}", bvar[i - 3]);
                ws.Cells[i, 4] = String.Format("{0,12:F3}", oavg[i - 3]);
                ws.Cells[i, 5] = String.Format("{0,12:F3}", ovar[i - 3]);
                ws.Cells[i, 6] = String.Format("{0,12:F3}", OBavg[i - 3]);
                ws.Cells[i, 7] = String.Format("{0,12:F3}", OBvar[i - 3]);
            }
            progressForm.Close();
            //WdSaveFormat为Excel文档的保存格式
            object format = MSExcel.XlFileFormat.xlWorkbookDefault;

            //将excelDoc文档对象的内容保存为XLSX
            excelDoc.SaveAs(path, format, misspara, misspara, misspara, misspara,
                            MSExcel.XlSaveAsAccessMode.xlExclusive,
                            misspara, misspara, misspara, misspara, misspara);
            //关闭excelDoc文档对象
            excelDoc.Close(misspara, misspara, misspara);
            //关闭excelApp组件对象
            excelApp.Quit();
        }