From f850b79aa872f43ff8bc8e361ba4e15d58acdcf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Tschumperl=C3=A9?= <david.tschumperle@gmail.com> Date: Wed, 10 Oct 2018 14:44:32 +0200 Subject: [PATCH] Add 'pycimg.py'. --- resources/pycimg.py | 113 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 resources/pycimg.py diff --git a/resources/pycimg.py b/resources/pycimg.py new file mode 100644 index 0000000..5bf8cd5 --- /dev/null +++ b/resources/pycimg.py @@ -0,0 +1,113 @@ +# +# File : pycimg.py +# ( Python file ) +# +# Description : Show how to import .cimg and .cimgz files into python (numpy). +# This file is a part of the CImg Library project. +# ( http://cimg.eu ) +# +# Copyright : Antonio Albiol, Universidad Politecnica Valencia (SPAIN) +# +# In case of issues or comments contact Antonio Albiol at: +# aalbiol (at) dcom.upv.es +# +# Licenses : This file is 'dual-licensed', you have to choose one +# of the two licenses below to apply. +# +# CeCILL-C +# The CeCILL-C license is close to the GNU LGPL. +# ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# +# or CeCILL v2.1 +# The CeCILL license is compatible with the GNU GPL. +# ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) +# +# This software is governed either by the CeCILL or the CeCILL-C license +# under French law and abiding by the rules of distribution of free software. +# You can use, modify and or redistribute the software under the terms of +# the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA +# at the following URL: "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL and CeCILL-C licenses and that you accept its terms. +# + +import numpy as np +import zlib +import os + +typesDict={'float':'float32' ,'double':'float64', +'unsigned_short':'uint16','unsigned_char':'uint8', +'int':'int32', 'short':'int16'} + +def cimgread( filename ): + """ USAGE: a= cimgread(filename) + For CImg Images: + * returns a npy array in the case of cimg + * Supports compression + * It squeezes singleton dimensions. If a CImg image has dimensions (w,h,1,c) + the returned python object will have shape + a.shape --> (h,w,c) + * a(y,x,z,c) to access one element + For CImgList: + * returns a list of npy arrays + * if original CImgList has nimages, then + len(a) --> nimages + * To access one pixel of the j-th image use a[j](y,x,z,c) + + """ + + basename, file_extension = os.path.splitext(filename) + fa = open(filename, 'rb') + + out =[] + line0 = fa.readline() #Endiannes + tiposdato=line0.split() + number_of_images=int(tiposdato[0]) + datatypecimg=tiposdato[1].decode() + endiannes = tiposdato[2] + + datatype = typesDict[datatypecimg]; + + for n in range(number_of_images): + line1 = fa.readline() # Dimensions + dimensiones = line1.split() + width = int(dimensiones[0]); + height = int(dimensiones[1]); + depth = int(dimensiones[2]); + spectrum = int(dimensiones[3]); + + if file_extension == '.cimgz': + csize= int(dimensiones[4].decode()[1:]) + data = fa.read(csize) + data = zlib.decompress(data) + else: + data = fa.read(width*height*depth*spectrum*dtype(datatype).itemsize) + + flattened = np.frombuffer(data,dtype=datatype) + + cimg=flattened.reshape((spectrum,depth,height,width)) + cimg=np.squeeze(np.transpose(cimg,(2,3,1,0))) + out.append(cimg) + + fa.close() + if len(out)==1: + return out[0] + return out -- GitLab