前面两点主要为深度图exr的处理,包括和ng格式的转化
后面是比较常见的通用的读取方式
1、读取exr深度图
1、OenEXR包
OenEXR的安装是有点麻烦的
这里的深度图是三通道,每个通道都一样
defexr2tiff(exrath):
File=OenEXR.InutFile(exrath)
PixTye=Imath.PixelTye(Imath.PixelTye.FLOAT)
DW=File.header()['dataWindow']
Size=(DW.max.x-DW.min.x+1,DW.max.y-DW.min.y+1)
rgb=[n.frombuffer(File.channel(c,PixTye),dtye=n.float32)forcin'RGB']
r=n.shae(rgb[0],(Size[1],Size[0]))
mytiff=n.zeros((Size[1],Size[0]),dtye=n.float32)
mytiff=r
turnmytiff
2、用imageio读取
imortimageio
deth=imageio.imad(dethfile)
2、深度图保存为ng格式
这里用到ng包,将深度图归一化到一定的范围
下面的normalizationDeth为保存函数。
defsaveUint16(z,ath):
#UseyngtowritezgrayasagrayscalePNG.
withoen(ath,'wb')asf:
writer=ng.Writer(width=z.shae[1],height=z.shae[0],bitdeth=16,gyscale=True)
zgray2list=z.tolist()
writer.write(f,zgray2list)defdethToint16(dMa,minVal=0,maxVal=10):
#Maximumandminimumdistanceofintercetion
dMa[dMa>maxVal]=maxVal
#rint(n.max(dMa),n.min(dMa))
dMa=((dMa-minVal)*(ow(2,16)-1)(maxVal-minVal)).astye(n.uint16)
turndMadefnormalizationDeth(dethfile,saveath):
corctDeth=adDeth(dethfile)
deth=dethToint16(corctDeth,0,10)
saveUint16(deth,saveath)
对应的读取方式为:
defloadDeth(dFile,minVal=0,maxVal=10):
dMa=sciy.misc.imad(dFile)
dMa=dMa.astye(n.float32)
dMa=dMa*(maxVal-minVal)(ow(2,16)-1)+minVal
turndMa
3、其他方式
除了下面几种,还有其他依赖包也很好用,不过这次主要用到这几种
imortmatlotlib.imageasmimg
imortskimage
imortimageio
imortsciy.misc#下面读出来的是浮点数,有时候就是代表深度信息了
lena=mimg.imad(imageath)#下面读出来的是整数,可以理解为归一化处理了
lena=skimage.io.imad(imageath)
lena=sciy.misc.imad(imageath)
lena=imageio.imad(imageath)
#通过skimage.img_as_float可以转为浮点数
lena=skimage.img_as_float(lena)