gdal浅析(二)波段操作

上次分析到将栅格数据读取到Dataset中,每个Dataset中包含若干个波段,Now let's go on!
首先介绍Band类:
band
类是用来描述栅格数据的各个波段的信息的。
详细的类介绍在此不贴出来了,太长,影响阅读效果。
其中主要的属性和方法将随着我下面的两个函数详细介绍。
本来这两天忙着看云计算,没有把心思放在Gdal上,恰巧Mr Zuo在研究workflow时建议我写一个可扩展可应用的处理栅格数据的模块让他在workflow中调用,于是便有了下面的文章。
今天主要写了两个函数
一、绝大部分栅格数据含有三个波段,其中的单一波段都不含颜色信息,只有灰度值信息,我们可以将这三个波段分别转换成基于RGB三原色的灰度图片
\\
将某一波段转换成只有灰度值的Image
void bandtoGrayImage(Band band, string fileName)
其中主要几个步骤
1
band.ReadRaster(0, 0, width, height, data, width, height, 0, 0);
将波段中的数据以byte的格式读到数组byte[] data中。
这意味着该波段的每一个像素的颜色灰度值按照先行后列的顺序存到数组中了。
2
Color newColor = Color.FromArgb(Convert.ToInt32(data[i + j * width]), Convert.ToInt32(data[i + j * width]), Convert.ToInt32(data[i + j * width]));
     bitmap.SetPixel(i, j, newColor);

将灰度值作为RGB的值,并由此计算出color值,并按像素绘制到Image中。
这一步因为需要按像素逐点计算并着色,需要较长的时间。但是将数组存储的像素值转换成Image貌似也只有这个笨方法了。实验中我将一个960×480的栅格文件转换出三个波段的图片需要2分钟左右。
上述函数中的newColor是将RGB三原色的值都等于同一灰度值,如果只是将其中一个赋为灰度值,其他两个设为0,则得到基于RGB的彩色图片。
即:Color newColor = Color.FromArgb(Convert.ToInt32(data[i + j * width]), 0, 0); //基于红色的彩色图像
这时候需要修改函数接口,增加一个标志项
      
void bandtoColorImage(Band band, string fileName,int colorType)

二、还有一种栅格数据只含有一个波段,而且这个波段是由RGB三原色波段组合而成的,含有颜色信息。因此我们可以将这一个波段转换成基于RGB三原色的有颜色的图片。这中栅格数据我只有一幅,还是从网上的一个实例中找到的。
\\
将某一波段转换成只有灰度值的Image
void bandtoColorsImage(Band band, string fileName)
其中主要几个步骤
1
band.ReadRaster(0, 0, width, height, data, width, height, 0, 0);
原理同一
2
ColorTable ct = band.GetRasterColorTable();
读取该波段的颜色表,其中的ColorTable类就是用来描述颜色表的,在下一步有重要作用。
3
ColorEntry entry = ct.GetColorEntry(data[i + j * width]);
获取颜色值。ColorTable类中的GetColorEntry方法可以将数组中灰度值转换成颜色值。这里出现的ColorEntry类是一种颜色值的表述。
4
Color newColor = Color.FromArgb(Convert.ToInt32(entry.c1), Convert.ToInt32(entry.c2), Convert.ToInt32(entry.c3));
     bitmap.SetPixel(i, j, newColor);

这一步从ColorEntry的实例中获取RGB格式的颜色值,entry.c1,entry.c2,entry.c3分别对应RGB三色值。

转载于:https://www.cnblogs.com/nudtchengguo/archive/2008/09/10/1288736.html

Python中可以使用GDAL库来存储多波段的TIFF图像。 首先要导入GDAL库: ```python from osgeo import gdal ``` 然后使用`gdal.GetDriverByName`函数创建一个驱动器对象,来指定要使用的文件格式,例如创建一个GeoTIFF驱动器对象: ```python driver = gdal.GetDriverByName("GTiff") ``` 接下来,定义图像的宽度、高度、波段数、数据类型等参数: ```python width = 100 height = 100 num_bands = 3 # 波段数为3 data_type = gdal.GDT_Byte # 数据类型为字节 ``` 然后,使用`driver.Create`函数创建一个新的多波段TIFF图像文件: ```python output_file = "output.tif" # 输出文件名 dataset = driver.Create(output_file, width, height, num_bands, data_type) ``` 之后,可以使用`dataset.GetRasterBand`函数按照波段索引获取每个波段对象,并分别设置波段的数据: ```python red_band = dataset.GetRasterBand(1) # 获取红色波段 red_data = np.zeros((height, width), dtype=np.uint8) # 自定义红色波段数据 red_band.WriteArray(red_data) # 将红色波段数据写入红色波段对象 green_band = dataset.GetRasterBand(2) # 获取绿色波段 green_data = np.zeros((height, width), dtype=np.uint8) # 自定义绿色波段数据 green_band.WriteArray(green_data) # 将绿色波段数据写入绿色波段对象 blue_band = dataset.GetRasterBand(3) # 获取蓝色波段 blue_data = np.zeros((height, width), dtype=np.uint8) # 自定义蓝色波段数据 blue_band.WriteArray(blue_data) # 将蓝色波段数据写入蓝色波段对象 ``` 最后,记得设置图像的地理信息和投影信息等属性并关闭文件: ```python dataset.SetGeoTransform((0, 1, 0, 0, 0, -1)) # 设置图像的地理变换参数 dataset.SetProjection("") # 设置图像的投影信息 dataset.FlushCache() # 刷新缓存 dataset = None # 关闭文件 ``` 这样就成功创建了一个包含多个波段的TIFF图像文件。根据需求,可以自定义每个波段的数据,实现自定义的多波段TIFF存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值