private void openPan1_Click(object sender, EventArgs e) { Gdal.AllRegister(); OpenFileDialog ofd = new OpenFileDialog(); //允许打开的文件格式 ofd.Filter = "Erdas Imagine (*.img)|*.img|" + "GeoTiff (*.tif *.tiff)|*.tif;*.tiff|" + "HDF (*.hdf *.h5 *he5)|*.hdf;*.h5;*he5|" + "位图文件 (*.bmp)|*.bmp|" + "Graphics Interchange Format (*.gif)|*.gif|" + "JPEG (*.jpg *.jpeg)|*.jpg;*.jpeg|" + "Portable Network Graphics (*.png)|*.png|" + "所有文件|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { file2 = ofd.FileName; ds2 = Gdal.Open(file2, Access.GA_ReadOnly); } Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = 600; pictureRect.Height = 450; Foudation fd = new Foudation(); Band band = ds2.GetRasterBand(1); img2 = fd.GetImage(ds2, pictureRect, band); }
//显示图片 private void ShowImage_Click(object sender, EventArgs e) { TreeNode imageNode = fileTree.SelectedNode; string filePath = imageNode.Tag.ToString(); Gdal.AllRegister(); ds = Gdal.Open(filePath, Access.GA_ReadOnly); //获取波段数 int bandCount = ds.RasterCount; Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = 600; pictureRect.Height = 450; Foudation fd = new Foudation(); if (bandCount == 3) { BandSelection selection = new BandSelection(); selection.ShowDialog(); int[] bandList = new int[3]; bandList[0] = selection.Band1; bandList[1] = selection.Band2; bandList[2] = selection.Band3; _bitmap = fd.GetImage(ds, pictureRect, bandCount, bandList); } else { Band band = ds.GetRasterBand(1); // _bitmap = null; _bitmap = fd.GetImage(ds, pictureRect, band); } pictureBox1.Image = _bitmap; _pictureChoose = true; }
private void openMsi1_Click(object sender, EventArgs e) { Gdal.AllRegister(); OpenFileDialog ofd = new OpenFileDialog(); //允许打开的文件格式 ofd.Filter = "Erdas Imagine (*.img)|*.img|" + "GeoTiff (*.tif *.tiff)|*.tif;*.tiff|" + "HDF (*.hdf *.h5 *he5)|*.hdf;*.h5;*he5|" + "位图文件 (*.bmp)|*.bmp|" + "Graphics Interchange Format (*.gif)|*.gif|" + "JPEG (*.jpg *.jpeg)|*.jpg;*.jpeg|" + "Portable Network Graphics (*.png)|*.png|" + "所有文件|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { file1 = ofd.FileName; ds1 = Gdal.Open(file1, Access.GA_ReadOnly); if (ds1.RasterCount < 3) { MessageBox.Show("不是多波段影像!\n请重新选择", "Error"); file1 = null; } } Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = 600; pictureRect.Height = 450; Foudation fd = new Foudation(); int[] bandList = new int[3]; bandList[0] = 3; bandList[1] = 2; bandList[2] = 1; img1 = fd.GetImage(ds1, pictureRect, 3, bandList); }
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e) { #region 打开待配准影像 OpenFileDialog op1 = new OpenFileDialog(); op1.Filter = "所有文件|*.*"; op1.Title = "打开待配准影像"; string op1name = op1.FileName; if (op1.ShowDialog() == DialogResult.OK) { //初始化设置 OSGeo.GDAL.Gdal.AllRegister(); // 初始化gdal库 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //设置为UTF-8编码 //打开影像 Dataset ds1 = OSGeo.GDAL.Gdal.Open(op1.FileName, OSGeo.GDAL.Access.GA_ReadOnly); ds1.GetGeoTransform(GeoTransform1); Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = this.pictureBox1.Width; pictureRect.Height = this.pictureBox1.Height; int[] disband = new int[3] { 1, 2, 3 }; Band band = ds1.GetRasterBand(1); Foudation fd = new Foudation(); Bitmap bitmap1 = fd.GetImage(ds1, pictureRect, band); //遥感影像构建位图 pictureBox1.Image = bitmap1; } #endregion #region 打开标准影像 OpenFileDialog op2 = new OpenFileDialog(); op2.Filter = "所有文件|*.*"; op2.Title = "打开标准影像"; string op2name = op2.FileName; if (op2.ShowDialog() == DialogResult.OK) { //初始化设置 OSGeo.GDAL.Gdal.AllRegister(); // 初始化gdal库 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //设置为UTF-8编码 //打开影像 Dataset ds2 = OSGeo.GDAL.Gdal.Open(op2.FileName, OSGeo.GDAL.Access.GA_ReadOnly); ds2.GetGeoTransform(GeoTransform2); Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = this.pictureBox2.Width; pictureRect.Height = this.pictureBox2.Height; int[] disband = new int[3] { 1, 2, 3 }; Foudation fd = new Foudation(); Bitmap bitmap2 = fd.GetImage(ds2, pictureRect, 3, disband);; //遥感影像构建位图 pictureBox2.Image = bitmap2; } #endregion }
private void 无人机影像粗校正ToolStripMenuItem_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { //ds = Gdal.Open(_filePath, Access.GA_ReadOnly); Bitmap bitmap = (Bitmap)pictureBox1.Image; double pi = Math.PI; double[] can = new double[11]; double w = ds.RasterXSize; double h = ds.RasterYSize; ImageCorrection iC = new ImageCorrection(); iC.ShowDialog(); can = iC.returnCan(); if (can[0] == 0) { return; } //校正参数 double B = can[1], L = can[2], Zs = can[3], fai = can[4] / 180 * pi, w0 = can[5] / 180 * pi; double k = can[6] / 180 * pi, Iw = can[7] * 0.001, Ih = can[8] * 0.001, f = can[9] * 0.001, u = can[10]; double Xs = 0, Ys = 0; Foudation fd = new Foudation(); double[] xy = fd.GeoTransform(B, L); Xs = xy[0]; Ys = xy[1]; //旋转矩阵参数 double a1 = Math.Cos(fai) * Math.Cos(k) - Math.Sin(fai) * Math.Sin(w0) * Math.Sin(k); double a2 = -Math.Cos(fai) * Math.Sin(k) - Math.Sin(fai) * Math.Sin(w0) * Math.Cos(k); double a3 = -Math.Sin(fai) * Math.Cos(w0); double b1 = Math.Cos(w0) * Math.Sin(k); double b2 = Math.Cos(w0) * Math.Cos(k); double b3 = -Math.Sin(w0); double c1 = Math.Sin(fai) * Math.Cos(k) + Math.Cos(fai) * Math.Sin(w0) * Math.Sin(k); double c2 = -Math.Sin(fai) * Math.Sin(k) + Math.Cos(fai) * Math.Sin(w0) * Math.Cos(k); double c3 = Math.Cos(fai) * Math.Cos(k); //角点图像坐标 double[,] Ixy = new double[5, 3]; Ixy[1, 1] = 0; Ixy[1, 2] = 0; Ixy[2, 1] = Iw; Ixy[2, 2] = Ih; Ixy[3, 1] = 0; Ixy[3, 2] = Ih; Ixy[4, 1] = Iw; Ixy[4, 2] = 0; //图像像元大小 double pixelSize_x = Iw / w; double pixelSize_y = Ih / h; //角点地面坐标 double[,] XY = new double[5, 3]; double Zp = 750;//平均高程待定 for (int i = 1; i < 5; i++) { XY[i, 1] = Xs + (Zp - Zs) * (a1 * Ixy[i, 1] + a2 * Ixy[i, 2] - a3 * f) / (c1 * Ixy[i, 1] + c2 * Ixy[i, 2] - c3 * f); XY[i, 2] = Ys + (Zp - Zs) * (b1 * Ixy[i, 1] + b2 * Ixy[i, 2] - b3 * f) / (c1 * Ixy[i, 1] + c2 * Ixy[i, 2] - c3 * f); } //输出影像最小范围 double Xmin = (XY[1, 1] < XY[3, 1] ? XY[1, 1] : XY[3, 1]); double Xmax = (XY[2, 1] > XY[4, 1] ? XY[2, 1] : XY[4, 1]); double Ymin = (XY[3, 2] < XY[4, 2] ? XY[3, 2] : XY[4, 2]); double Ymax = (XY[1, 2] > XY[2, 2] ? XY[1, 2] : XY[2, 2]); int outwid = (int)((Xmax - Xmin) / u) + 10; int outhei = (int)((Ymax - Ymin) / u) + 10; //构建位图 double Xp, Yp; double x, y; Driver dryMemory = Gdal.GetDriverByName("MEM"); Dataset dsMemory = dryMemory.Create("", outwid, outhei, ds.RasterCount, DataType.GDT_CInt32, null); //dsMemory.SetProjection(ds.GetGCPProjection()); double[] GeoTrans = new double[6]; GeoTrans[0] = Xmin; GeoTrans[3] = Ymin; GeoTrans[1] = u; GeoTrans[5] = -u; GeoTrans[2] = 0; GeoTrans[4] = 0; dsMemory.SetGeoTransform(GeoTrans); dsMemory.SetProjection(" PROGCS[''G-K'']"); for (int i = 0; i < outhei; i++) { int[][] R = new int[ds.RasterCount][]; for (int bandindex = 0; bandindex < ds.RasterCount; bandindex++) { R[bandindex] = new int[outwid]; } for (int j = 0; j < outwid; j++) { //地面坐标 Xp = j * u + Xmin; Yp = (i) * u + Ymin; //解像点坐标 x = -f * (a1 * (Xp - Xs) + b1 * (Yp - Ys) + c1 * (Zp - Zs)) / (a3 * (Xp - Xs) + b3 * (Yp - Ys) + c3 * (Zp - Zs)); y = -f * (a2 * (Xp - Xs) + b2 * (Yp - Ys) + c2 * (Zp - Zs)) / (a3 * (Xp - Xs) + b3 * (Yp - Ys) + c3 * (Zp - Zs)); //对应原来图像的行列号 int i0 = (int)(x / pixelSize_x); int j0 = (int)(y / pixelSize_y); if (i0 >= 0 && i0 < ds.RasterXSize && j0 >= 0 && j0 < ds.RasterYSize) { for (int bandindex = 0; bandindex < ds.RasterCount; bandindex++) { int[] r_read = new int[1]; Band band = ds.GetRasterBand(bandindex + 1); band.ReadRaster(i0, j0, 1, 1, r_read, 1, 1, 0, 0); R[bandindex][j] = r_read[0]; } } else { for (int bandindex = 0; bandindex < ds.RasterCount; bandindex++) { R[bandindex][j] = 0; } } } for (int bandindex = 0; bandindex < ds.RasterCount; bandindex++) { Band memBand1 = dsMemory.GetRasterBand(bandindex + 1); memBand1.WriteRaster(0, i, R[bandindex].Length, 1, R[bandindex], R[bandindex].Length, 1, 0, 0); } } Driver drvJPG = Gdal.GetDriverByName("GTiff"); string dstFileName = @"E:\Correction.Tif";; //Dataset dstDs = drvJPG.Create(dstFileName, srcWidth, srcHeight, bandCount, DataType.GDT_Byte, null); drvJPG.CreateCopy(dstFileName, dsMemory, 1, null, null, null); ds = dsMemory; Rectangle pictureRect = new Rectangle(); pictureRect.X = 0; pictureRect.Y = 0; pictureRect.Width = this.pictureBox1.Width; pictureRect.Height = this.pictureBox1.Height; int[] disband = new int[3] { 1, 2, 3 }; Bitmap bitmap2 = fd.GetImage(this.ds, pictureRect, 3, disband); //遥感影像构建位图 pictureBox1.Image = bitmap2; MessageBox.Show("计算完成!"); } else { MessageBox.Show("没有图像!", "Error!"); } }