mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-12-04 20:05:38 +00:00
114 lines
4.3 KiB
Python
114 lines
4.3 KiB
Python
|
#
|
||
|
# 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
|