当前位置: 首页 > 后端技术 > Python

Python修复遥感图像条纹的两种方法

时间:2023-03-26 16:43:47 Python

简介Landsat7ETM+卫星图像由于卫星传感器故障,导致之后获取的图像出现条纹。如下图所示,图像被条带均匀覆盖。GDAL修复LandsatETM+影像波段使用GDAL修复影像波段的代码如下:defgdal_repair(tif_name,out_name,bands):"""tif_name(string):源图像名称out_name(string):输出图像名称bands(integer):图像波段数"""#打开图像文件tif=gdal.Open(tif_name)#根据文件类型获取对应驱动driver=gdal.GetDriverByName('GTiff')#根据已有数据使用指定文件的驱动设置创建一个新的可写数据集#所有支持创建新文件的驱动都支持`CreateCopy()`方法,#但只有`Create()`部分支持该方法#CreateCopy的第一个参数是目标文件名,第二个参数是源数据集#第三个参数的值为`0`或`1`,取值为`0`。即使原始数据不能准确转换为目标数据,程序仍然会执行new_img=driver.CreateCopy(out_name,tif,0)foriintqdm(range(1,bands)):#分别处理每个bandband=new_img.GetRasterBand(i)#使用FillNodata对strip部分进行插值gdal.FillNodata(targetBand=band,maskBand=band,maxSearchDist=15,smoothingIterations=0)#将修复后的band写入新数据集new_img.GetRasterBand(i).WriteArray(band.ReadAsArray())修复后的效果图如下:Opencv修复LandsatETM+图像条使用opencv修复图像的代码如下:defcv2_repair(tif_name):#读取tif图像tif_data=gdal_array.LoadFile(tif_name).astype('float32')#获取掩码mask=tif_data.sum(axis=0)mask=(mask==0).astype(np.uint8)bands=tif_data.shape[0]res=[]foriintqdm(range(bands)):#cv.Inpaint(src,inpaintMask,dst,inpaintRadius,flags)#src:源图像,可以是8位、16位无符号整数和32位浮点数pointType1channelor8-bitunsigned3-channel#inpaintMask:Mask,8-bitunsignedint#dst:Outputwiththesamesizeasthesourceimage#inpaintRadius:算法考虑的每个修复点的圆形邻域Halfpath#flags:修复算法类型,可选cv2.INPAINT_NS和cv2.INPAINT_TELEArepaired=cv2.inpaint(tif_data[i],mask,3,flags=cv2.INPAINT_TELEA)res.append(repaired)returnnp.array(res)修复后的结果图:使用opencv修复图像,速度比Gdal慢很多,但是修复质量更好参考https://www.bogotobogo.com/py...https://gis.stackexchange.com...