在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不为空的图像进行处理
有关于第②个不足就需要读者自己动动脑子更新一下代码啦
大概的思路就是先判断栅格点是否在研究区内,若不在就是背景区域(就可以将其转为空啦),若在则保留该值。
①通过PIESDK的算法(波段运算)将NoData值设为空
②通过无所不能的代码设置图像的背景值设为NaN
浙公网安备 33010602011771号