1. 程式人生 > 實用技巧 >在PIESDK中如何設定影象資料值為空

在PIESDK中如何設定影象資料值為空

在進行影象運算時,人們常常會遇到背景值(或者說無效值,以下簡稱背景值)也會參與運算
這或許會干擾到我們最後的成圖效果
那麼在PIESDK中如何使用演算法對其設定為空呢?
這裡有兩種方式
1、無需編寫程式碼即可完成(但影象的NoData值應該為無)

通過PIESDK原本就有的演算法——波段運算!

原理:0/0並輸出為浮點型即可獲得空
那麼我們首先就需要把背景值通過波段運算設定為0,然後再通過b1/b1*b1將背景值轉為空
那麼將背景值設定為0也是有技巧的,最常用的是在不更改其他值的情況下將背景值轉為0

設背景值為-1,那麼公式為:(b1==(-1))0+(b1!=(-1))b1

但是此方法有兩個不足:
①無效值NoData不為空的影象無法進行處理
②非背景值為0時也會誤將其也設為空

2.通過無所不能的程式碼設定影象的背景值設為NaN(影象的NoData值可為任何值)
下面給出一個比較簡單的模板,讀者可根據自己的需求做出修改
此程式碼是在原有的影象中修改的,建議先行備份再測試,也可新增程式碼以輸出一份新的影象做測試

        //建議先備份資料
        PIE.DataSource.IRasterDataset rasterdataset1 = PIE.DataSource.DatasetFactory.OpenRasterDataset(openfiledialog.FileName, PIE.DataSource.OpenMode.Update);//開啟模式為Update
        if (rasterdataset1 == null) return;
        int ysize = rasterdataset1.GetRasterYSize();//柵格資料集的行數(高度)
        int xsize = rasterdataset1.GetRasterXSize(); //柵格資料集的列數(寬度)
        double[] array = new double[1];
        for (int y = 0; y < ysize; y++)
        {
            for (int x = 0; x < xsize; x++)
            {
                bool bRead = rasterdataset1.Read(x, y, 1, 1, array, 1, 1, PIE.DataSource.PixelDataType.Float64, 1, new int[] { 1 });//讀取柵格值
                if (array[0] == 0)
                {
                    array[0] = double.NaN;//空值
                    bool bWrite = rasterdataset1.Write(x, y, 1, 1, array, 1, 1, PIE.DataSource.PixelDataType.Float64, 1, new int[] { 1 }); //更新柵格值
                }
            }
        }
        //釋放掉即可立刻完成更新,否則需要等待一段時間
        (rasterdataset1 as IDisposable).Dispose();
        rasterdataset1 = null;

注意:只有對影象的資料型別為浮點型(float或者double)設定為NaN才有效
因為只有float和double有NaN值


我這裡通過波段運算做了個簡單的測試,公式為b1+b2
b1的資料型別為整型(int),NoData值為0
b2的資料型別為單精度浮點型(float),NoData值為空(NaN)
然後輸出一個數據型別為整型(int)和一個單精度浮點型(float)的影象

結果顯示,浮點型的資料還是NaN,整型的還是0
那麼這樣我們就可以對原本是浮點型的影象直接修改背景值為NaN
對不是浮點型的影象則輸出一個新的浮點型影象將背景值設為NaN,其他值不變
這樣就解決了我們方法1的第①個不足——可對無效值NoData不為空的影象進行處理

有關於第②個不足就需要讀者自己動動腦子更新一下程式碼啦
大概的思路就是先判斷柵格點是否在研究區內,若不在就是背景區域(就可以將其轉為空啦),若在則保留該值。