1. 程式人生 > >遙感影象處理 | 利用GDAL開啟影象並讀取影象元資料(波段)資訊(C#)

遙感影象處理 | 利用GDAL開啟影象並讀取影象元資料(波段)資訊(C#)

事前準備:

編譯並配置GDAL庫。


函式和方法說明:

public static Dataset Open(string utf8_path, Access eAccess)

從指定路徑讀取柵格資料。第一個引數是柵格資料的路徑,第二個引數是開啟資料的模式,GA_ReadOnly表示以只讀方式開啟,GA_Update表示以讀寫方式開啟。該函式返回一個Dataset物件,gdal用Dataset物件為所有柵格資料提供統一的訪問介面。Dataset中包含1個或多個band,還包含了柵格資料的大小、nodatavalue等資訊。

        OSGeo.GDAL.Gdal.AllRegister();        // 初始化gdal庫

        OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");    //設定為UTF-8編碼

        OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(ofd.FileName, OSGeo.GDAL.Access.GA_ReadOnly);

 

public class Dataset

      

  柵格影像資訊

        public int RasterCount { get; }

        public int RasterXSize { get; }

        public int RasterYSize { get; }

        int width = dataset.GetRasterXSize();   //影象寬

        int height = dataset.GetRasterYSize();     //影象高

        int bandCount = dataset.GetRasterCount();    // 獲取柵格資料的點的數量

 

public class Band

        讀取波段資訊

        public DataType DataType { get; }

        public ColorTable GetColorTable();

        public Band GetMaskBand();

        public int GetMaskFlags();

        public Band GetOverview(int i);

        public int GetOverviewCount();

        獲取統計值       

        public void GetMaximum(out double val, out int hasval);//最小值

        public void GetMinimum(out double val, out int hasval);//最大值

        public void GetNoDataValue(out double val, out int hasval);  //獲取沒有資料的點      

double val; int hasval;
public void GetMaximum(out val, out hasval);//最小值
public void GetMinimum(out val, out hasval);//最大值
public void GetNoDataValue(out val, out hasval);  //獲取沒有資料的點      

 

public void GetGeoTransform(double[] argout);

argout為仿射變換引數。一般來說,仿射座標轉換就是通過幾個值來進行柵格框架到地理框架的對映。GDAL中的仿射變換引數包括6個值,可以使用這6個引數來計算每個畫素點的座標:

                 Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)

                 Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)

其中Xgeo, Ygeo是地理座標, Xpixel, Yline是畫素座標。GT是係數陣列。若影像正上為北方向,GT(2)和GT(4),表示影象旋轉系數,對於一般影象這兩個的係數為零,GT(1)為畫素寬度,GT(5)為畫素高度,一般這兩個值相等符號相反。(GT(0),GT(3))位置是光柵左上角畫素的左上角。 上面所說的點/線座標系是從左上角(0,0)點到右下角,也就是座標軸從左到右增長,從上到下增長的座標系。


處理過程:

1,在要使用gdal的檔案頭部加上如下名稱空間的宣告:

using OSGeo.GDAL;

3.讀取程式碼可以將圖片轉化為Bitmap格式顯示       https://blog.csdn.net/weixin_41340063/article/details/82733728

4.主函式讀取程式碼如下:           

        private void Form1_Load(object sender, EventArgs e)
        {
            OSGeo.GDAL.Gdal.AllRegister();
            OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
         }

        private void 開啟ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = @"所有檔案|*.*";
            ofd.Title = "開啟圖片";
            ofd.ShowDialog();
            string filename = ofd.FileName;
            if(filename ==null)
            {
                MessageBox.Show("影像路徑不能為空");
                return;
            }
            OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(ofd.FileName, OSGeo.GDAL.Access.GA_ReadOnly);//只讀方式開啟

            //顯示影像
            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 bitmap = CommonClass.GetImage(ds, pictureRect, disband); ;   //遙感影像構建點陣圖
            BITMAP = bitmap;
            pictureBox1.Image = bitmap;    //將點陣圖傳遞給PictureBox控制元件進行顯示
        }
    }