python画像の読み取りについて、png、exrなど

10815 ワード

前の2点は主に深さ図exrの処理であり、pngフォーマットとの変換を含む後、比較的一般的な一般的な読み取り方式である.
1、exr深さ図を読み取る
1、OpenEXRパッケージ
OpenEXRのインストールはちょっと面倒ですここの深さ図は3チャネルで、各チャネルは同じです
def exr2tiff(exrpath):
    File = OpenEXR.InputFile(exrpath)
    PixType = Imath.PixelType(Imath.PixelType.FLOAT)
    DW = File.header()['dataWindow']
    Size = (DW.max.x - DW.min.x + 1, DW.max.y - DW.min.y + 1)
    rgb = [np.frombuffer(File.channel(c, PixType), dtype=np.float32) for c in 'RGB']
    r =np.reshape(rgb[0], (Size[1],Size[0]))
    mytiff = np.zeros((Size[1], Size[0]), dtype=np.float32)
    mytiff = r
    return mytiff
    

2、imageioで読み取る
import imageio
depth = imageio.imread(depthfile)

2、深さ図をpng形式に保存する
ここではpngパケットを用い,深さマップを一定の範囲下のnormalizationDepthに正規化して保存関数とする.
def saveUint16(z, path):
    # Use pypng to write zgray as a grayscale PNG.
    with open(path, 'wb') as f:
        writer = png.Writer(width=z.shape[1], height=z.shape[0], bitdepth=16, greyscale=True)
        zgray2list = z.tolist()
        writer.write(f, zgray2list)

def depthToint16(dMap, minVal=0, maxVal=10):
    #Maximum and minimum distance of interception 
    dMap[dMap>maxVal] = maxVal
    # print(np.max(dMap),np.min(dMap))
    dMap = ((dMap-minVal)*(pow(2,16)-1)/(maxVal-minVal)).astype(np.uint16)
    return dMap

def normalizationDepth(depthfile, savepath):
    correctDepth = readDepth(depthfile)
    depth = depthToint16(correctDepth, 0, 10)
    saveUint16(depth,savepath)

対応する読み取り方法は次のとおりです.
def loadDepth(dFile, minVal=0, maxVal=10):
    dMap = scipy.misc.imread(dFile)
    dMap = dMap.astype(np.float32)
    dMap = dMap*(maxVal-minVal)/(pow(2,16)-1) + minVal
    return dMap

3、その他の方式
以下の他にも依存パックがあり使いやすいですが、今回は主にこれらのものを使います
import matplotlib.image as mpimg
import skimage
import imageio
import scipy.misc

#           ,            
lena = mpimg.imread(imagepath)

#          ,           
lena = skimage.io.imread(imagepath)
lena = scipy.misc.imread(imagepath)
lena = imageio.imread(imagepath)
#   skimage.img_as_float       
lena = skimage.img_as_float(lena)