pix格式的摸索(二)

PCI的PIX格式是一种巧妙设计的遥感图像格式,它特别关注图像的大小端字节存储问题。本文详细介绍了PIX文件如何通过在每个波段头部存储特定标记来记录字节序信息,并在不同字节序的计算机之间正确读取和转换图像数据。

作者:朱金灿

来源:http://blog.youkuaiyun.com/clever101

   

        PCI的系统格式pix是一个设计很巧妙的遥感图像格式,而且其设计巧妙之处不止一处两处,这些都有待我日后一一去摸索。今天就具体谈谈它的设计巧妙的一个地方——它是认真地考虑图像的大小端字节存储的问题并作出了针对性的设计。

 

        关于计算机处理器的大小端字节序存储的基础知识不在本文的论述范围之列,有兴趣的读者可以阅读《深入理解计算机系统》这本书。首先要讨论的问题是图像作为一种二进制文件格式,是否有大小端存储之分?我认为是有的。可能有些读者对此有疑问:大小端不是对处理器而言的吗?图像怎么有大小端存储之分的呢?实际上是有的。我们想象这样一个场景:假如一个图像是在一个大端机器创建并处理了,毫无疑问它是按大端的字节序存储的,现在用户把它拷贝到一个小端机器上浏览,软件不知道它是按大端存储还是按小端存储的,就想当然地按小端字节序来浏览,自然就看到一堆乱码而不是一个预想中的有序图像。这个问题其实是一直存在的,为什么我们几乎很少碰到?一是我们日常接触的都是8位图像(8位图像不存在字节序存储问题,大于8位的图像在遥感领域很常见),二则很可能是因为PC领域一直是由intel的小端模式的x86架构所统治。

 

        现在问题来了:如何解决这个问题?显然要根本解决问题是图像文件要提供记忆自己是哪种字节序来存储的功能。pix文件正是基于这种考虑,在每个波段头都存储了它是按哪种字节序存储的标记(绝妙的是它是每个波段都有这个标记,这就意味着它的每个波段是可以按照不同的字节序存储的)。现在我们看看pix文件是如何具体实现的。这个我们从PCI公司提供的读写pix文件的开源库中找到答案。首先源码中的PCIDSK::Create函数是负责创建pix文件的。在pix文件中每个波段头都有1024字节用于存储波段的描述信息,其中它的第201个字节就是用于保存是大端字节序存储还是小端字节序存储的,设为'S'为小端存储,设为'N'为大端存储。注意要直接指定ih.buffer[201]='S';而不能使用它的设置函数,如ih.Put('S',201,1);Put函数是一个坑爹的函数!

 

        在读取和写入pix文件是这样处理的:

unsigned short test_value = 1;
// byte_order保存的是图像是按哪种字节序存储
//假如是小端机器,同时又是小端存储,那么就不需要交换高低位的数//据,否则需要交换
if( ((uint8 *) &test_value)[0] == 1 ) 
	needs_swap = (byte_order != 'S');
else  //假如是大端机器,办法和小端一样
     needs_swap = (byte_order == 'S');

交换的做法很简单,以交换32位浮点数为例,具体如下:

   BYTE  *pbBuffer = NULL;
   BYTE  *pbtPixel = NULL;
float fValue=(static_cast<float*>(pvBuffer))[i];
					   pbtPixel=(BYTE*)(&fValue);
					   *pbBuffer = pbtPixel[3];
					   pbBuffer++;
					   *pbBuffer = pbtPixel[2];
					   pbBuffer++;
					   *pbBuffer = pbtPixel[1];
					   pbBuffer++;
					   *pbBuffer = pbtPixel[0];
					   pbBuffer++;

Pix4D是一款专业的摄影测量和地理空间数据处理软件,广泛应用于无人机(UAV)图像处理、三维建模、地形测绘、农业监测、建筑和工程设计等领域。该软件支持多种输入和输出数据格式,以满足不同行业用户的需求。 ### 输入数据格式 Pix4D支持多种图像和地理空间数据格式作为输入,主要包括: - **图像格式**:包括常见的JPEG(.jpg)、TIFF(.tif)、PNG(.png)、BMP(.bmp)等。对于专业摄影测量应用,支持多光谱和热成像图像,例如来自Parrot Sequoia、Micasense RedEdge等传感器的数据[^1]。 - **GPS/IMU数据**:用于图像地理定位,支持EXIF标签中嵌入的GPS信息,也可通过外部文件提供更精确的POS(Position and Orientation System)数据,如文本文件(.txt或.csv)格式。 - **控制点文件**:用于提高重建精度,支持文本格式(.txt或.csv)包含地面控制点(GCPs)的坐标信息。 - **激光雷达数据**(LiDAR):支持点云数据的导入,常见格式包括LAS和LAZ。 ### 输出数据格式 Pix4D生成的输出数据广泛用于地理信息系统(GIS)、计算机辅助设计(CAD)、三维可视化和数据分析等领域,主要包括: - **三维模型**:支持导出为OBJ、PLY、STL、3D Tiles等格式,适用于三维可视化和虚拟现实应用。 - **正射影像**(Orthomosaic):输出为GeoTIFF(.tif)、JPEG(.jpg)等格式,带有地理参考信息,可直接用于GIS分析[^1]。 - **数字高程模型**(DEM)和**数字表面模型**(DSM):通常导出为GeoTIFF或ASCII Grid(.asc)格式,用于地形分析和建模。 - **点云数据**:支持导出为LAS、LAZ、XYZ(ASCII)等格式,用于进一步的LiDAR处理或地形建模[^1]。 - **矢量数据**:通过Pix4Dsurvey模块,可以导出为DXF(.dxf)和SHP(.shp)格式,适用于CAD和GIS应用。 - **报告和元数据**:包括项目摘要报告、质量报告、相机参数等,通常以PDF(.pdf)或文本文件(.txt)格式输出。 ### 示例代码:导出GeoTIFF格式的正射影像 ```python # 示例伪代码,说明如何使用Pix4D API导出正射影像 project = pix4d.open_project("path/to/project.p4d") orthomosaic = project.generate_orthomosaic() orthomosaic.export("output/orthomosaic.tif", format="GeoTIFF") ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值