Source code for fluidimage.data_objects.preproc

"""Preprocessing data objects (:mod:`fluidimage.data_objects.preproc`)
======================================================================

.. autoclass:: ArraySerie
   :members:
   :private-members:

.. autoclass:: PreprocResults
   :members:
   :private-members:

"""

import math
import os

import h5py

from fluiddyn.util.serieofarrays import SerieOfArraysFromFiles
from fluidimage.util import imsave, imsave_h5

from .piv import ArrayCouple, LightPIVResults


def get_Ni_Nj(serie):
    """Returns number of images in the first and second indices
    of the series.

    """
    if not isinstance(serie, SerieOfArraysFromFiles):
        raise ValueError(
            "serie must be an instance of class SerieOfArraysFromFiles"
        )

    nb_indices = serie.nb_indices
    slices = serie.get_slicing_tuples()
    Ni = slices[0][1] - slices[0][0]
    if nb_indices == 1:
        Nj = 1
    elif nb_indices == 2:
        if len(slices[1]) == 1:
            Nj = 1
        else:
            Nj = slices[1][1] - slices[1][0]
    else:
        raise NotImplementedError(
            "Cannot evaluate series with more than 2 indices"
        )

    return Ni, Nj


def get_ind_middle(serie):
    Ni, Nj = get_Ni_Nj(serie)
    ind_middle_start = int(math.floor(Ni / 2.0)) * Nj
    ind_middle_end = int(math.ceil(Ni / 2.0)) * Nj
    if Ni % 2 == 0:
        ind_middle_start -= 1

    return ind_middle_start, ind_middle_end


def get_name_preproc(serie, name_files, ind_serie, nb_series, out_format):
    ind_middle_start, ind_middle_end = get_ind_middle(serie)

    if ind_serie == 0 and nb_series == 1:
        s = -1
    elif ind_serie == 0:
        s = ind_middle_start
    elif ind_serie == nb_series - 1:
        s = -1
    else:
        s = ind_middle_start

    if out_format == "img":
        return name_files[s]

    else:
        fname, ext = os.path.splitext(name_files[s])
        fname += "." + out_format
        return fname


[docs]class ArraySerie(ArrayCouple): def __init__( self, names=None, arrays=None, serie=None, ind_serie=0, nb_series=1, str_path=None, hdf5_parent=None, ): if str_path is not None: self._load(path=str_path) return if hdf5_parent is not None: self._load(hdf5_object=hdf5_parent["serie"]) return if serie is not None: names = serie.get_name_arrays() paths = serie.get_path_arrays() self.paths = tuple(os.path.abspath(p) for p in paths) if arrays is None: arrays = serie.get_arrays() self.ind_serie = ind_serie self.nb_series = nb_series self.names = tuple(names) self.arrays = tuple(arrays) self.serie = serie def clear_data(self): self.arrays = tuple() def save(self, path=None, hdf5_parent=None): if path is not None: raise NotImplementedError if not isinstance(hdf5_parent, (h5py.File,)): raise NotImplementedError hdf5_parent.create_group("serie") group = hdf5_parent["serie"] group.attrs["names"] = self.names group.attrs["paths"] = self.paths
[docs]class PreprocResults(LightPIVResults): _keys_to_be_saved = ["data"] def __init__(self, params=None, str_path=None, hdf5_object=None): if hdf5_object is not None: if params is not None: self.params = params self._load_from_hdf5_object(hdf5_object) return if str_path is not None: self._load(str_path) return self.params = params self.data = {} def clear_data(self): self.data = {} def save(self, path=None): out_format = self.params.saving.format for k, v in self.data.items(): path_file = os.path.join(path, k) if out_format == "img": imsave(path_file, v, as_int=True) elif out_format == "h5": attrs = { "class_name": "PreprocResults", "module_name": self.__module__, } imsave_h5(path_file, v, self.params, attrs, as_int=True) else: # Try to save in formats supported by PIL.Image imsave(path_file, v, format=out_format, as_int=True) self.clear_data() return path_file