近期,在做一个水印系统,原本只应用opencv处理普通图像就好了,但老师要求还得能处理遥感瓦片数据,接下来就开始了一段痛苦的旅程,当然最后问题都解决了,现在就是做个总结。
1,处理遥感图像,必须要用GDAL!!
(1)如果只是查看8位遥感图像,可以只使用opencv,PIL或者Tiff库直接读取;
(2)如果只是查看16位遥感图像,可以先进行数据拉伸降到8位,然后使用opencv,PIL或者Tiff库直接读取;
def Tiff16to8bit(img_16): if np.max(img_16) - np.min(img_16) != 0: # img_nrm = (img_16 - np.min(img_16)) / (np.max(img_16) - np.min(img_16)) #计算灰度范围,归一化 img_nrm = normalization(img_16) img_8 = np.uint8(255 * img_nrm) return img_8
但这样显示的图像会与使用envi显示的有所差别。(当然是以envi为准!)
注:这是以前的草稿,现在说明一下,16位降8位,理论上正确的做法是找到当前波段的最大值和最小值,以二者之差作为整个区间,计算当前像素所占比例,再以此比例乘以255,但是得到的结果还是会有较大的图像损失。还有的博客提到利用gdal.Translate来实现,我试了下,结果比自己按照原理写的效果要好一些,但这个涉及到很多