Google Earth Engine城市水体提取
大家都知道城市水体提取相比较于山区,丘陵的地区,肯定是比较难的,为什么呢,因为城市水体有很多高层建筑导致的阴影,这个就非常复杂了,而且现在很多高分影像只有可见光和近红外波段,那么我们如何准确提取城市水体呢?
Remoe Sensing2018年刊发了一篇城市水体高分影像自动提取算法(Two-Step Urban Water Index (TSUWI): A New Technique for High-Resolution Mapping of Urban SurfaceWater [J]Remote Sensing,2018),初步看来,效果还行,在高分二号上面效果不错,我再想,如果对于开源的哨兵、Landsat如何?这些是中等分辨率影像,能做到吗?
话不多说,利用GEE,直接编码,实验结果如下(以2018年10月的北京某景Sentinel2影像为例):
![](https://i-blog.csdnimg.cn/blog_migrate/219d155dbeab204a95b44e3ed50a6b06.png)
(a) 这是原始影像
(b) 这是城市水体指数
(c) 这是城市阴影指数
(d) 这是城市水体提取结果,蓝色为水体
其中城市水体指数和城市阴影指数计算公式如下所示:
我把最终成果发布成了APPengine(https://wang749195.users.earthengine.app/view/urbanwaterextraction),大家可以直接在web上看,总的来说,实验结果还是不错的,去掉了阴影现象,这篇文章出自中科院遥感所,在此申明,值得一读,后续我会发布C++软件版本,Matlab版本,以及Python版本。我个人的开发思路是,首先用GEE实现,如果GEE不好实现,就用matlab或者python实现第一遍,效果可以,能工程应用,立马就用GDAL+C++打包成工程源代码,我感觉这样会节省时间,且不会造成时间浪费。
接着上面讲,我们用c++来实现一遍,使用GDAL读写影像,先把这两个函数写上来:
/*栅格影像读取,返回数据指针 * imgPath:图像位置 * 返回float类型的数据指针 */ void readImage(char *imgpath, imgData *IMG, int bandindex) { GDALDataset *img = (GDALDataset*)GDALOpen(imgpath, GA_ReadOnly); if (img != NULL) { int imgWidth = img->GetRasterXSize(); //图像宽度,特别注意:对应matlab中的行 int imgHeight = img->GetRasterYSize(); //图像高度,特别注意:对应matlab中的列 int bandNum = img->GetRasterCount();