介绍了遥感影像通用数据格式BIP、BIL、BSQ,并给出MATLAB、C++从原始二进制数据读取影像的代码~
🌿前言
遥感影像的
通用数据格式
有BIP、BIL、BSQ三种,通常在编程处理图像时都会使用GDAL、Arcpy、Rasterio等库来进行读取,如果因某些原因使用不了这些库,又该如何解决呢?
本文先简单介绍了BIP、BIL、BSQ三种通用格式的区别,随后分析了如何正确读取二进制存储遥感数据,最后给出了MATLAB和C++读取参考代码。
文末有获取项目所有文件的方式~
🍀BIP&BIL&BSQ
BIP
BIP(Band Interleaved by Pixel),可以理解为按照像素存储,先依次存储每个波段的第一个像素,再存储每个波段的第二个像素...
BIL
BIL(Band Interleaved by Line),可以理解为按照行进行存储,先依次存储每个波段的第一行,再存储每个波段的第二行...
BSQ
BSQ(Band Sequential),即按照顺序存储,依次存第一个波段所有像素,再存第二个波段所有像素...
一图理解
下图应该能够很好的反映出存储的方式(按照对应的数字顺一遍就很好理解)
了解更多可以参考此链接:https://blog.csdn.net/m0_46387817/article/details/108467947
🌸数据读取思路
重要两点
有关如何正确地读取影像数据,笔者认为有两点是至关重要的:
-
弄清所读楚遥感影像的存储是BIP还是BIL还是BSQ
-
如果数据格式不正确,就会导致数据读取的有问题,例如一个存储类型是8位的数据按照16位的数据类型读取,就会直接导致读取到的数组大小发生改变,这个错误还容易发现。
如果数据格式存储的8位无符号整型,恰好又按照8位的整型去读取,读出来的数组大小一致,但是值已经是错误的值了。
数据存储类型
读取步骤
-
需要根据影像的元数据文件或者一些属性信息,了解影像单个像元存储的数据类型,再利用一些读取二进制文件的函数例如MATLAB中的fopen和fread函数、C++中的ifstream函数将数据正确地读到一维数组。
-
根据索引关系将一维数组解析为对应的波段数组。
索引关系
关于如何建立一维数组和波段数组(三维)的关系,即建立一个
的函数:
式中,
表示一维数组中的索引,
分别代表第
行、第
列、第
个波段,
是待求量。
笔者也是思考了很久,简单总结出如下两种思考方法(其实两种很类似,也挺绕的😴):
方法一
即固定任意两个变量的值为0,变化第三个变量的值,观察其规律,解求得到其对应的待求量。