Image processing 如何在Fortran程序中读取.raw文件?
我正在用Fortran编写一个旧的有限元代码。这是大学里的一个研究项目 我有一个文件.raw,它代表一个3D图像 .raw文件中的数据存储在uint16或uint8中,整数的总数是已知的 如何在Fortran程序中将此图像读取到整数数组 类似的东西Image processing 如何在Fortran程序中读取.raw文件?,image-processing,fortran,Image Processing,Fortran,我正在用Fortran编写一个旧的有限元代码。这是大学里的一个研究项目 我有一个文件.raw,它代表一个3D图像 .raw文件中的数据存储在uint16或uint8中,整数的总数是已知的 如何在Fortran程序中将此图像读取到整数数组 类似的东西 allocate(imgarray(total_int)) call raw2array(filename,imgarray) 我目前正在使用python读取图像,并将其转换为整数向量。该向量用Fortran和文本文件读取 python中的 img
allocate(imgarray(total_int))
call raw2array(filename,imgarray)
我目前正在使用python读取图像,并将其转换为整数向量。该向量用Fortran和文本文件读取
python中的
imgarray = np.fromfile(fid, dtype=np.uint16,count=total_int,sep='')
但是,当读取超过1000x1000x1000个整数的文件时,过程会变得非常缓慢
该项目要求image.raw在Fortran程序中作为完成向量的子程序以二进制形式读取
如何读取此图像(二进制)并使用Fortran中的子例程将其转换为整数向量?如果您的编译器支持16位整数和流访问,它就这么简单
use iso_fortran_env
implicit none
integer(kind=INT16), allocatable::m(:,:,:)
allocate(m(1000,1000,1000))
open(100,file='test.raw',access='stream')
read(100)m
end
根据@agentp给出的解决方案,.raw文件在数组中读取为:
use iso_fortran_env
implicit none
integer(kind=INT16), allocatable::m(:)
integer total_int
total_int = 1000*1000*1000
allocate(m(total_int))
open(100,file='test.raw',access='stream')
read(100)m
但是,当读取超过1000x1000x1000个整数的文件时,过程会变得非常缓慢。我真的怀疑用Fortran读起来会更快。你试过什么吗?你有什么我们可以建立的代码吗?文件是Fortran顺序还是C顺序?阅读Fortran中的流访问。@VladimirF实际上代码是在F90中,我错了,因为我看到程序是用gfortran编译的,并与mpi77链接。代码的非并行版本在F77中。请勿发布任何链接,请在此处显示相关代码。你做了什么,或者你只是想从我们这里得到一个完整的解决方案?您知道在Fortran中通常如何从外部文件读取数据吗?您需要在这里访问流。然后它可以是单个
read
语句。试着自己做点什么。以流形式打开,然后执行读取(单位)imgarray
。报告发生的事情。@VladimirF谢谢你的指导。我不想从任何人那里得到一个完整的解决方案。感谢这项工作,通过一些小的更改,我可以读取.raw文件。这两种情况下的性能非常相似。对于128x128x128(uint16)的映像,python和fortran都花了1秒。对于288x288x300(uint8)python的映像,需要12秒,而fortran 11需要12秒。