| # |
| # 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 |