C# GDAL 数字图像处理Part9 辐射定标与输出Dataset

        这篇文章比较好写,先写这篇,自动配准应该应该会在周四之后更新。

        辐射定标应该是一个比较简单的内容,本章我们主要介绍如何输出Dataset。由于辐射定标后我们应该输出一个TIFF或IMG之类格式的文件,所以这里就干脆放在一起讲。

1.辐射定标

        辐射定标的来由就不多赘述,直接到辐射定标的公式:

NewValue=FactorScale \times OldValue + bias

        FactorScale:拉伸系数

        bias:偏置

        所以,我们只需要逐个读出Dataset中每一个Band上的每一个像素的值,乘以 拉伸系数,再加上 偏置,就得到了新的值,然后创建一个新的Dataset用来接收每一个新的值即可。

2.实现

        这次尝试新的讲代码的方法,给大家讲各行代码的作用,大家看喜好组合起来就可以。

        首先,我们获得用户输入的FactorScale与bias,假设,我是说假设它们在程序中的名字是:

double scale, offset;

        方便起见,这里scale就代表FactorScale,offset就代表bias,一个意思。如何从TextBox读取用户输入的数据就不多说了,这里假设已经读取到两个变量里了。

        (下面用红色表示变量)

        接下来呢,我们要获取用户想要保存的位置,其实大家很熟悉,就像是用Word或PPT点击“另存为”时弹出的让我们选择路径的窗口,函数如下:

        public string SaveFileDialog()
        {
            var savedialog = new System.Windows.Forms.SaveFileDialog();
            savedialog.Title = "保存图片";
            savedialog.Filter = "TIF 图片|*.tif";
            savedialog.FilterIndex = 3;//设置默认文件类型显示顺序 
            savedialog.RestoreDirectory = true; //点了保存按钮进入
            if (savedialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string pictureName = savedialog.FileName;
                return pictureName;
            }
            else
                return null;

        }

        这个函数的返回值是用户选择的路径或者null哈,然后:

            string path = SaveFileDialog();
            if (path == null) return;

        这样,我们就获得了用户选择的路径,变量名是path

        接下来我们创造一个Driver(驱动)类,这是Gdal中创建新的Dataset所必须的步骤

OSGeo.GDAL.Driver driver = OSGeo.GDAL.Gdal.GetDriverByName("GTiff");

       参数 “GTiff” 就是输出的格式,这里是tiff格式,大家可以去搜索输出其他格式

        然后呢,我们就可以用driver来创造新的Dataset:

var out_dataset = driver.Create(path, Xsize, Ysize, BandCount, Dtype, null);

        给大家讲讲Create里的函数,以下是Create在Gdal里的的声明:

        1.utf8_path :也就是保存的路径

        2.xsize:设定输出图像的Xsize

        3.ysize:设定输出图像的Ysize

        4.bands:设定输出图像的波段数

        5.eType:设定输出图像的数据类型,数据类型可以通过Band类的DataType属性访问,如:

你自己的dataset的名字 . GetRasterBand(1).DataType

        6.options:我也不知道

        执行完了这一函数呢,一个新的Tiff图片其实已经在我们的硬盘里产生了,但是里面的所有值都还是0,接下来我们就需要对每一个波段的每一个像素赋值。

        在赋值之前,大家看看下图:

        我们还可以通过 .set......  来设置输出的影像的描述、六参数、元数据等等等...这里不讲太多。 

        然后是赋值,其实也就是对每一个波段每一个位置使用ReadRaster函数读出原始Dataset的数据,进行处理后通过WriteRaster函数输入新的dataset中。

            int[] OriV = new int[1];//Original Value
            int[] NewV = new int[1];//New Value

        这里定义两个变量,用来接收旧的值和新的值,使用数组是因为读写Band只能是数组格式。

            for (int i = 1; i <= out_dataset.RasterCount; i++)
            {
                for (int y = 0; y < out_dataset.RasterYSize; y++)
                    for (int x = 0; x < out_dataset.RasterXSize; x++)
                    {
                        OriV = new int[1] { 0 };//重置原图像值
                        old_dataset.GetRasterBand(i).ReadRaster(x, y, 1, 1, OriV, 1, 1, 0, 0); //写入了Val

                        NewV[0] = (int)Math.Round(OriV[0] * scale + offset);//计算

                        out_dataset.GetRasterBand(i).WriteRaster(x, y, 1, 1, NewV, 1, 1, 0, 0); //写入新的Val
                    }
            }
            out_dataset.FlushCache();//结束

        遍历每一个波段每一个像素,对每一个像素进行处理,这就是上面的代码所做的事情。

        out_dataset和old_dataset就是输出的影像和原始的影像。

        好,这就是输出Dataset(TIFF格式)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值