imgseries


Nameimgseries JSON
Version 0.7.3 PyPI version JSON
download
home_pagehttps://github.com/ovinc/imgseries
SummaryImage inspection and analysis tools for image series
upload_time2024-05-17 14:41:10
maintainerNone
docs_urlNone
authorOlivier Vincent
requires_python>=3.6
licenseCeCILL-2.1
keywords image analysis inspection series contour tracking grey level gray
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            About
=====

Image inspection and analysis tools for image series, based on the following classes.

*Representation of image sequences:*
- `ImgSeries` (sequence stored in multiple files),
- `ImgStack` (sequence stored in a stack, e.g. tiff or HDF5).
Objects from these classes can also be generated with the `series()` and `stack()` methods, respectively;

*Analysis of image sequences:*
- `GreyLevel`: evolution of average gray level of selected zone(s),
- `ContourTracking`: track objects by contour(s) detection,
- `Front1D`: measure fronts propagating in one direction,
- `Flicker`: analyze image flicker with reference zone(s).
These classes act on `ImgSeries` or `ImgStack` objects.

The package is customizable and designed to easily incorporate modifications and additional, user-defined plugins (e.g. different type of analysis methods); see *Customize_Analysis.ipynb* and *Customize_Images.ipynb* in the `examples` folder.

How to install:

```bash
pip install imgseries
```

The package is under CeCILL license (equivalent to - and compatible with - GNU GPL, see below).

Quick start
===========

Below is some information to use the functions available in **imgseries**.
For more details and examples, please also consult docstrings and the Jupyter notebooks in the `examples` folder: *ImgSeries_Static.ipynb*, *ImgSeries_Interactive.ipynb*, *Analysis_GreyLevel.ipynb* and *Analysis_ContourTracking.ipynb*.


The management of file series, possibly spread out over multiple folders, follows the scheme of `filo.Series`. In particular, image files are attributed a unique `num` identifier that starts at 0 in the first folder. See `filo` documentation for details. The `ImgSeries` thus directly inherits from `filo.Series`.

*Warning*

If running on a Windows machine and using the parallel option in some of the analysis codes, the call of the function must not be run during import of the python file containing the script (e.g. by using a `if __name__ == '__main__'` block). This is because in Windows, multiprocessing imports the main program when setting up processes, which causes recursive problems. The problem does not arise on Linux / MacOS.


`ImgSeries`, `ImgStack`: general image series manipulation
----------------------------------------------------------

See also the notebook with examples and details *ImgSeries.ipynb* in the `examples` folder.

```python
from imgseries import ImgSeries, series

# ----------------------------------------------------------------------------
# ======= WORKING WITH IMAGE SERIES (distinct, individual image files) =======
# ----------------------------------------------------------------------------

# EITHER:
images = ImgSeries(paths=['img1', 'img2'])  # implicitly, savepath is current directory
# OR:
images = series(paths=['img1', 'img2'])
# (the series() function is a bit more powerful than the ImgSeries class, as it
# allows the user to select caching options for speed improvements, see below)

# Image dimensions in x and y
images.nx, images.ny

# Access individual images in the series -------------------------------------

images.files[10]       # filo.File object of image number num=10
images.files[10].file  # actual pathlib.Path file object
images.read(10)        # read image number num=10 into numpy array
images.show(10)        # show image in a matplotlib graph

# Interactive views of image sequence ----------------------------------------

images.animate()       # see image series as a movie (start, end, skip options)
images.inspect()       # browse through image series with a slider (same options)
images.profile()         # object that also has inspect(), animate() methods etc.

# Define display options (only for grayscale imagee --------------------------
# (see details in notebook)
images.display.define('contrast')  # set vmin, vmax in imshow interactively
images.display.define('colormap')  # set cmap in imshow() interactively

# Manually: (equivalent: images.display.limits = 0, 255)
images.display.vmin, images.display.vmax = 0, 255
images.display.cmap = 'viridis'

images.save_display()  # save rotation and crop parameters in a json file
images.load_display()  # load rotation and crop parameters from json file

# Define global transform applied on all images (rotation + crop) ------------
# (see details in notebook)

# Note: the transforms to be considered and the order with which they are
# applied on the images can be modified by passing the argument
# transforms= in ImgSeries. For example:
# images = series(transforms=('rotation', 'crop', 'filter'))

# Interactive:
images.rotation.define()
images.crop.define()
images.filter.define()
images.threshold.define()

# Manual:
images.grayscale.apply = True
images.rotation.angle = -70
images.crop.zone = (2, 25, 400, 600)
images.filter.size = 10
images.subtraction.reference = range(5)  # avg first 5 images for subtraction
images.subtraction.relative = True       # (I - Iref) / I_ref instead of I - Iref
images.threshold.vmin = 220  # everything below vmin is False, rest True
images.threshold.vmax = 240  # everything below vmax is True, rest False
# Note: threshold.vmin can be combined with threshold.vmax for a bandpass

# Other transform parameters / methods:
images.save_transforms()  # save rotation, crop etc. parameters in a json file
images.load_transforms()  # load rotation, crop etc. parameters from json file
images.active_transforms  # see currently applied transforms on images
images.reset_transforms()  # reset all transforms

# Corrections can also be applied to image sequences, e.g. flicker and shaking
# (See also Flicker analysis class, below)
# Contrary to transforms, corrections can be
images.flicker.load()
images.save_corrections()
images.active_corrections  # see currently applied corrections on images
images.reset_corrections()  # reset all corrections

# Exporting images (with transforms and/or corrections)
images.export()  # see examples/Export.ipynb for examples

# Manage image timestamps ----------------------------------------------------
images.info  # see correspondence num / file info + automatically extracted image time
images.save_info()  # save above info in a csv file
images.load_info()  # Load info from previously saved csv data (overwrites images.files)
images.load_time('Time_File.txt')  # Keep images.files but update its time information with data from an external csv file.

# ----------------------------------------------------------------------------
# ===================== WORKING WITH A .TIFF IMAGE STACK =====================
# ----------------------------------------------------------------------------

images = ImgSeries(stack='ImgStack.tif')

# All methods/attributes above available, except those associated with timestamps
```

### Caching images for speed improvement

```python
images = series(paths=['img1', 'img2'], cache=True)
images.inspect()  # inspection should be significantly faster
```
See *ImgSeries_Caching.ipynb* for examples, details and options (cache size etc.).
By default, caching is disabled because it can lead to significant memory usage for large files.


`GreyLevel`: average grey level analysis in image series
--------------------------------------------------------

Follow the average grey level (brightness) of one or more selected zones (default: whole image) on the image sequence.
The `GreyLevel` class accepts an image sequence (`ImgSeries` type, see above) as an input parameter. See also docstrings and the notebook with examples and details: *Analysis_GreyLevel.ipynb* in the `examples` folder.

```python
from imgseries import GreyLevel, GreyLevelResults

# Create analysis object -----------------------------------------------------
gl = GreyLevel(images)

# Prepare and run analysis ---------------------------------------------------
# NOTE: if no zones are defined, full image is taken as a default
gl.zones.define()  # interactively select zones on image
gl.zones.load()    # alternative to define() where zones are loaded from saved metadata

# other alternative to load image series and analysis parameters from saved files
gl.regenerate()

gl.run()    # run actual analysis (parallel computation available);
gl.results  # is an object containing data and metadata of the analysis
gl.results.save()

# Interactive views of results -----------------------------------------------
gl.show()      # show result of analysis on a given image (default: first one)
gl.animate()   # see results as a movie (start, end, skip options)
gl.inspect()   # browse through results with a slider (same options)

# Load analysis results afterwards (need save() to have been called) ---------
results = GreyLevelResults()
results.load()   # load analysis results (data + metadata)
results.data, results.metadata  # useful attributes
```


`ContourTracking`: object tracking using contours in image series
-----------------------------------------------------------------

Follow contours of iso-grey-level on image sequence. The `GreyLevel` class accepts an image sequence (`ImgSeries` type, see above) as an input parameter. See also docstrings and the notebook with examples and details: *Analysis_ContourTracking.ipynb* in the `examples` folder.

```python
from imgseries import ContourTracking, ContourTrackingResults

# Create analysis object
ct = ContourTracking(images)

# Prepare and run analysis ---------------------------------------------------
ct.threshold.define()  # interactively select threshold level
ct.contours.define()   # interactively select contours at the above level
ct.contours.load()     # alternative to define() where contours are loaded from saved metadata

# other alternative to load image series and analysis parameters from saved files
ct.regenerate()

ct.run()      # run actual analysis (no parallel computation available)
ct.results    # is an object containing data and metadata of the analysis
ct.results.save()     # save results (data + metadata) to files (csv, json)

# Interactive views of results -----------------------------------------------
ct.show()      # show result of analysis on a given image (default: first one)
ct.animate()   # see results as a movie (start, end, skip options)
ct.inspect()   # browse through results with a slider (same options)

# Load analysis results afterwards (need save() to have been called) ---------
results = ContourTrackingResults()
results.load()   # load analysis results (data + metadata)
results.data, results.raw_contour_data, results.metadata  # useful attributes
```

`Front1D`: Analyze 1D propagating fronts with grey level analysis
-----------------------------------------------------------------

Analyze fronts propagating in one direction (e.g., *x*), by averaging grey levels in the other direction (*y*). The program returns a line of pixel values along *x* as a function of time (i.e., a reslice of the data), where each pixel is an average of all other pixels along *y*. The operation and methods are similar to `GreyLevel` or ``ContourTracking` (see above). See also docstrings and the notebook with examples and details: *Analysis_Front1D.ipynb* in the `examples` folder.

```python
from imgseries import Front1D, Front1DResults
f1d = Front1D(images)
f1d.run()
```


`Flicker`: Get image flicker from grey level variations on a zone
-----------------------------------------------------------------

Analyze flicker on images based on the average gray level variation in a reference zone in the image. The operation and methods are very similar to `GreyLevel`, including reference zone definition (see above). See also docstrings and the notebook with examples and details: *Analysis_Flicker.ipynb* in the `examples` folder.

```python
from imgseries import Flicker, FlickerResults
flick = Flicker(images)
flick.zones.define()
flick.run()
```

The results are stored as a ratio, which is by how much the pixel values in the image have to be divided to remove apparent flicker.

Afterwards, these results can be loaded in the image series to correct flicker automatically (as a *corrections* parameter):
```python
images.flicker.load()
```


# Requirements / dependencies

## Python packages

(installed by pip automatically if necessary)
- skimage (scikit-image)
- matplotlib
- numpy
- importlib-metadata
- tqdm (waitbars)
- filo (file series management) >= 1.1
- gittools (get git commit info) >= 0.5
- imgbasics (basic image processing) >= 0.3.0
- drapo (interactive tools for matplotlib figures) >= 1.2.1


## Python version
- Python >= 3.6 because of f-string formatting

# Author

Olivier Vincent

(ovinc.py@mgmail.com)

# License

This software is under the CeCILL-2.1 license, equivalent to GNU-GPL (see https://cecill.info/)

Copyright Olivier Vincent (2021-2024)
(ovinc.py@gmail.com)

This software is a computer program whose purpose is to provide tools for
inspection and analysis of image sequences
(either as individual files or as stacks).

This software is governed by the CeCILL 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
license 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 license and that you accept its terms.

  CeCILL FREE SOFTWARE LICENSE AGREEMENT

Version 2.1 dated 2013-06-21


    Notice

This Agreement is a Free Software license agreement that is the result
of discussions between its authors in order to ensure compliance with
the two main principles guiding its drafting:

  * firstly, compliance with the principles governing the distribution
    of Free Software: access to source code, broad rights granted to users,
  * secondly, the election of a governing law, French law, with which it
    is conformant, both as regards the law of torts and intellectual
    property law, and the protection that it offers to both authors and
    holders of the economic rights over software.

The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
license are:

Commissariat à l'énergie atomique et aux énergies alternatives - CEA, a
public scientific, technical and industrial research establishment,
having its principal place of business at 25 rue Leblanc, immeuble Le
Ponant D, 75015 Paris, France.

Centre National de la Recherche Scientifique - CNRS, a public scientific
and technological establishment, having its principal place of business
at 3 rue Michel-Ange, 75794 Paris cedex 16, France.

Institut National de Recherche en Informatique et en Automatique -
Inria, a public scientific and technological establishment, having its
principal place of business at Domaine de Voluceau, Rocquencourt, BP
105, 78153 Le Chesnay cedex, France.


    Preamble

The purpose of this Free Software license agreement is to grant users
the right to modify and redistribute the software governed by this
license within the framework of an open source distribution model.

The exercising of this right is conditional upon certain obligations for
users so as to preserve this status for all subsequent redistributions.

In consideration of access to the source code and the 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 only have limited liability.

In this respect, the risks associated with loading, using, modifying
and/or developing or reproducing the software by the user are brought to
the user's attention, given its Free Software status, which may make it
complicated to use, with the result that its use is reserved for
developers and experienced professionals having in-depth computer
knowledge. Users are therefore encouraged to load and test the
suitability of the software 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 of
security. This Agreement may be freely reproduced and published,
provided it is not altered, and that no provisions are either added or
removed herefrom.

This Agreement may apply to any or all software for which the holder of
the economic rights decides to submit the use thereof to its provisions.

Frequently asked questions can be found on the official website of the
CeCILL licenses family (http://www.cecill.info/index.en.html) for any
necessary clarification.


    Article 1 - DEFINITIONS

For the purpose of this Agreement, when the following expressions
commence with a capital letter, they shall have the following meaning:

Agreement: means this license agreement, and its possible subsequent
versions and annexes.

Software: means the software in its Object Code and/or Source Code form
and, where applicable, its documentation, "as is" when the Licensee
accepts the Agreement.

Initial Software: means the Software in its Source Code and possibly its
Object Code form and, where applicable, its documentation, "as is" when
it is first distributed under the terms and conditions of the Agreement.

Modified Software: means the Software modified by at least one
Contribution.

Source Code: means all the Software's instructions and program lines to
which access is required so as to modify the Software.

Object Code: means the binary files originating from the compilation of
the Source Code.

Holder: means the holder(s) of the economic rights over the Initial
Software.

Licensee: means the Software user(s) having accepted the Agreement.

Contributor: means a Licensee having made at least one Contribution.

Licensor: means the Holder, or any other individual or legal entity, who
distributes the Software under the Agreement.

Contribution: means any or all modifications, corrections, translations,
adaptations and/or new functions integrated into the Software by any or
all Contributors, as well as any or all Internal Modules.

Module: means a set of sources files including their documentation that
enables supplementary functions or services in addition to those offered
by the Software.

External Module: means any or all Modules, not derived from the
Software, so that this Module and the Software run in separate address
spaces, with one calling the other when they are run.

Internal Module: means any or all Module, connected to the Software so
that they both execute in the same address space.

GNU GPL: means the GNU General Public License version 2 or any
subsequent version, as published by the Free Software Foundation Inc.

GNU Affero GPL: means the GNU Affero General Public License version 3 or
any subsequent version, as published by the Free Software Foundation Inc.

EUPL: means the European Union Public License version 1.1 or any
subsequent version, as published by the European Commission.

Parties: mean both the Licensee and the Licensor.

These expressions may be used both in singular and plural form.


    Article 2 - PURPOSE

The purpose of the Agreement is the grant by the Licensor to the
Licensee of a non-exclusive, transferable and worldwide license for the
Software as set forth in Article 5 <#scope> hereinafter for the whole
term of the protection granted by the rights over said Software.


    Article 3 - ACCEPTANCE

3.1 The Licensee shall be deemed as having accepted the terms and
conditions of this Agreement upon the occurrence of the first of the
following events:

  * (i) loading the Software by any or all means, notably, by
    downloading from a remote server, or by loading from a physical medium;
  * (ii) the first time the Licensee exercises any of the rights granted
    hereunder.

3.2 One copy of the Agreement, containing a notice relating to the
characteristics of the Software, to the limited warranty, and to the
fact that its use is restricted to experienced users has been provided
to the Licensee prior to its acceptance as set forth in Article 3.1
<#accepting> hereinabove, and the Licensee hereby acknowledges that it
has read and understood it.


    Article 4 - EFFECTIVE DATE AND TERM


      4.1 EFFECTIVE DATE

The Agreement shall become effective on the date when it is accepted by
the Licensee as set forth in Article 3.1 <#accepting>.


      4.2 TERM

The Agreement shall remain in force for the entire legal term of
protection of the economic rights over the Software.


    Article 5 - SCOPE OF RIGHTS GRANTED

The Licensor hereby grants to the Licensee, who accepts, the following
rights over the Software for any or all use, and for the term of the
Agreement, on the basis of the terms and conditions set forth hereinafter.

Besides, if the Licensor owns or comes to own one or more patents
protecting all or part of the functions of the Software or of its
components, the Licensor undertakes not to enforce the rights granted by
these patents against successive Licensees using, exploiting or
modifying the Software. If these patents are transferred, the Licensor
undertakes to have the transferees subscribe to the obligations set
forth in this paragraph.


      5.1 RIGHT OF USE

The Licensee is authorized to use the Software, without any limitation
as to its fields of application, with it being hereinafter specified
that this comprises:

 1. permanent or temporary reproduction of all or part of the Software
    by any or all means and in any or all form.

 2. loading, displaying, running, or storing the Software on any or all
    medium.

 3. entitlement to observe, study or test its operation so as to
    determine the ideas and principles behind any or all constituent
    elements of said Software. This shall apply when the Licensee
    carries out any or all loading, displaying, running, transmission or
    storage operation as regards the Software, that it is entitled to
    carry out hereunder.


      5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS

The right to make Contributions includes the right to translate, adapt,
arrange, or make any or all modifications to the Software, and the right
to reproduce the resulting software.

The Licensee is authorized to make any or all Contributions to the
Software provided that it includes an explicit notice that it is the
author of said Contribution and indicates the date of the creation thereof.


      5.3 RIGHT OF DISTRIBUTION

In particular, the right of distribution includes the right to publish,
transmit and communicate the Software to the general public on any or
all medium, and by any or all means, and the right to market, either in
consideration of a fee, or free of charge, one or more copies of the
Software by any means.

The Licensee is further authorized to distribute copies of the modified
or unmodified Software to third parties according to the terms and
conditions set forth hereinafter.


        5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION

The Licensee is authorized to distribute true copies of the Software in
Source Code or Object Code form, provided that said distribution
complies with all the provisions of the Agreement and is accompanied by:

 1. a copy of the Agreement,

 2. a notice relating to the limitation of both the Licensor's warranty
    and liability as set forth in Articles 8 and 9,

and that, in the event that only the Object Code of the Software is
redistributed, the Licensee allows effective access to the full Source
Code of the Software for a period of at least three years from the
distribution of the Software, it being understood that the additional
acquisition cost of the Source Code shall not exceed the cost of the
data transfer.


        5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE

When the Licensee makes a Contribution to the Software, the terms and
conditions for the distribution of the resulting Modified Software
become subject to all the provisions of this Agreement.

The Licensee is authorized to distribute the Modified Software, in
source code or object code form, provided that said distribution
complies with all the provisions of the Agreement and is accompanied by:

 1. a copy of the Agreement,

 2. a notice relating to the limitation of both the Licensor's warranty
    and liability as set forth in Articles 8 and 9,

and, in the event that only the object code of the Modified Software is
redistributed,

 3. a note stating the conditions of effective access to the full source
    code of the Modified Software for a period of at least three years
    from the distribution of the Modified Software, it being understood
    that the additional acquisition cost of the source code shall not
    exceed the cost of the data transfer.


        5.3.3 DISTRIBUTION OF EXTERNAL MODULES

When the Licensee has developed an External Module, the terms and
conditions of this Agreement do not apply to said External Module, that
may be distributed under a separate license agreement.


        5.3.4 COMPATIBILITY WITH OTHER LICENSES

The Licensee can include a code that is subject to the provisions of one
of the versions of the GNU GPL, GNU Affero GPL and/or EUPL in the
Modified or unmodified Software, and distribute that entire code under
the terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL.

The Licensee can include the Modified or unmodified Software in a code
that is subject to the provisions of one of the versions of the GNU GPL,
GNU Affero GPL and/or EUPL and distribute that entire code under the
terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL.


    Article 6 - INTELLECTUAL PROPERTY


      6.1 OVER THE INITIAL SOFTWARE

The Holder owns the economic rights over the Initial Software. Any or
all use of the Initial Software is subject to compliance with the terms
and conditions under which the Holder has elected to distribute its work
and no one shall be entitled to modify the terms and conditions for the
distribution of said Initial Software.

The Holder undertakes that the Initial Software will remain ruled at
least by this Agreement, for the duration set forth in Article 4.2 <#term>.


      6.2 OVER THE CONTRIBUTIONS

The Licensee who develops a Contribution is the owner of the
intellectual property rights over this Contribution as defined by
applicable law.


      6.3 OVER THE EXTERNAL MODULES

The Licensee who develops an External Module is the owner of the
intellectual property rights over this External Module as defined by
applicable law and is free to choose the type of agreement that shall
govern its distribution.


      6.4 JOINT PROVISIONS

The Licensee expressly undertakes:

 1. not to remove, or modify, in any manner, the intellectual property
    notices attached to the Software;

 2. to reproduce said notices, in an identical manner, in the copies of
    the Software modified or not.

The Licensee undertakes not to directly or indirectly infringe the
intellectual property rights on the Software of the Holder and/or
Contributors, and to take, where applicable, vis-à-vis its staff, any
and all measures required to ensure respect of said intellectual
property rights of the Holder and/or Contributors.


    Article 7 - RELATED SERVICES

7.1 Under no circumstances shall the Agreement oblige the Licensor to
provide technical assistance or maintenance services for the Software.

However, the Licensor is entitled to offer this type of services. The
terms and conditions of such technical assistance, and/or such
maintenance, shall be set forth in a separate instrument. Only the
Licensor offering said maintenance and/or technical assistance services
shall incur liability therefor.

7.2 Similarly, any Licensor is entitled to offer to its licensees, under
its sole responsibility, a warranty, that shall only be binding upon
itself, for the redistribution of the Software and/or the Modified
Software, under terms and conditions that it is free to decide. Said
warranty, and the financial terms and conditions of its application,
shall be subject of a separate instrument executed between the Licensor
and the Licensee.


    Article 8 - LIABILITY

8.1 Subject to the provisions of Article 8.2, the Licensee shall be
entitled to claim compensation for any direct loss it may have suffered
from the Software as a result of a fault on the part of the relevant
Licensor, subject to providing evidence thereof.

8.2 The Licensor's liability is limited to the commitments made under
this Agreement and shall not be incurred as a result of in particular:
(i) loss due the Licensee's total or partial failure to fulfill its
obligations, (ii) direct or consequential loss that is suffered by the
Licensee due to the use or performance of the Software, and (iii) more
generally, any consequential loss. In particular the Parties expressly
agree that any or all pecuniary or business loss (i.e. loss of data,
loss of profits, operating loss, loss of customers or orders,
opportunity cost, any disturbance to business activities) or any or all
legal proceedings instituted against the Licensee by a third party,
shall constitute consequential loss and shall not provide entitlement to
any or all compensation from the Licensor.


    Article 9 - WARRANTY

9.1 The Licensee acknowledges that the scientific and technical
state-of-the-art when the Software was distributed did not enable all
possible uses to be tested and verified, nor for the presence of
possible defects to be detected. In this respect, the Licensee's
attention has been drawn to the risks associated with loading, using,
modifying and/or developing and reproducing the Software which are
reserved for experienced users.

The Licensee shall be responsible for verifying, by any or all means,
the suitability of the product for its requirements, its good working
order, and for ensuring that it shall not cause damage to either persons
or properties.

9.2 The Licensor hereby represents, in good faith, that it is entitled
to grant all the rights over the Software (including in particular the
rights set forth in Article 5 <#scope>).

9.3 The Licensee acknowledges that the Software is supplied "as is" by
the Licensor without any other express or tacit warranty, other than
that provided for in Article 9.2 <#good-faith> and, in particular,
without any warranty as to its commercial value, its secured, safe,
innovative or relevant nature.

Specifically, the Licensor does not warrant that the Software is free
from any error, that it will operate without interruption, that it will
be compatible with the Licensee's own equipment and software
configuration, nor that it will meet the Licensee's requirements.

9.4 The Licensor does not either expressly or tacitly warrant that the
Software does not infringe any third party intellectual property right
relating to a patent, software or any other property right. Therefore,
the Licensor disclaims any and all liability towards the Licensee
arising out of any or all proceedings for infringement that may be
instituted in respect of the use, modification and redistribution of the
Software. Nevertheless, should such proceedings be instituted against
the Licensee, the Licensor shall provide it with technical and legal
expertise for its defense. Such technical and legal expertise shall be
decided on a case-by-case basis between the relevant Licensor and the
Licensee pursuant to a memorandum of understanding. The Licensor
disclaims any and all liability as regards the Licensee's use of the
name of the Software. No warranty is given as regards the existence of
prior rights over the name of the Software or as regards the existence
of a trademark.


    Article 10 - TERMINATION

10.1 In the event of a breach by the Licensee of its obligations
hereunder, the Licensor may automatically terminate this Agreement
thirty (30) days after notice has been sent to the Licensee and has
remained ineffective.

10.2 A Licensee whose Agreement is terminated shall no longer be
authorized to use, modify or distribute the Software. However, any
licenses that it may have granted prior to termination of the Agreement
shall remain valid subject to their having been granted in compliance
with the terms and conditions hereof.


    Article 11 - MISCELLANEOUS


      11.1 EXCUSABLE EVENTS

Neither Party shall be liable for any or all delay, or failure to
perform the Agreement, that may be attributable to an event of force
majeure, an act of God or an outside cause, such as defective
functioning or interruptions of the electricity or telecommunications
networks, network paralysis following a virus attack, intervention by
government authorities, natural disasters, water damage, earthquakes,
fire, explosions, strikes and labor unrest, war, etc.

11.2 Any failure by either Party, on one or more occasions, to invoke
one or more of the provisions hereof, shall under no circumstances be
interpreted as being a waiver by the interested Party of its right to
invoke said provision(s) subsequently.

11.3 The Agreement cancels and replaces any or all previous agreements,
whether written or oral, between the Parties and having the same
purpose, and constitutes the entirety of the agreement between said
Parties concerning said purpose. No supplement or modification to the
terms and conditions hereof shall be effective as between the Parties
unless it is made in writing and signed by their duly authorized
representatives.

11.4 In the event that one or more of the provisions hereof were to
conflict with a current or future applicable act or legislative text,
said act or legislative text shall prevail, and the Parties shall make
the necessary amendments so as to comply with said act or legislative
text. All other provisions shall remain effective. Similarly, invalidity
of a provision of the Agreement, for any reason whatsoever, shall not
cause the Agreement as a whole to be invalid.


      11.5 LANGUAGE

The Agreement is drafted in both French and English and both versions
are deemed authentic.


    Article 12 - NEW VERSIONS OF THE AGREEMENT

12.1 Any person is authorized to duplicate and distribute copies of this
Agreement.

12.2 So as to ensure coherence, the wording of this Agreement is
protected and may only be modified by the authors of the License, who
reserve the right to periodically publish updates or new versions of the
Agreement, each with a separate number. These subsequent versions may
address new issues encountered by Free Software.

12.3 Any Software distributed under a given version of the Agreement may
only be subsequently distributed under the same version of the Agreement
or a subsequent version, subject to the provisions of Article 5.3.4
<#compatibility>.


    Article 13 - GOVERNING LAW AND JURISDICTION

13.1 The Agreement is governed by French law. The Parties agree to
endeavor to seek an amicable solution to any disagreements or disputes
that may arise during the performance of the Agreement.

13.2 Failing an amicable solution within two (2) months as from their
occurrence, and unless emergency proceedings are necessary, the
disagreements or disputes shall be referred to the Paris Courts having
jurisdiction, by the more diligent Party.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ovinc/imgseries",
    "name": "imgseries",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "image, analysis, inspection, series, contour, tracking, grey, level, gray",
    "author": "Olivier Vincent",
    "author_email": "ovinc.py@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/57/0e/55bc5459ec764b2665b6678fbee59acf57afbb0101d651ffccd1dd860067/imgseries-0.7.3.tar.gz",
    "platform": null,
    "description": "About\n=====\n\nImage inspection and analysis tools for image series, based on the following classes.\n\n*Representation of image sequences:*\n- `ImgSeries` (sequence stored in multiple files),\n- `ImgStack` (sequence stored in a stack, e.g. tiff or HDF5).\nObjects from these classes can also be generated with the `series()` and `stack()` methods, respectively;\n\n*Analysis of image sequences:*\n- `GreyLevel`: evolution of average gray level of selected zone(s),\n- `ContourTracking`: track objects by contour(s) detection,\n- `Front1D`: measure fronts propagating in one direction,\n- `Flicker`: analyze image flicker with reference zone(s).\nThese classes act on `ImgSeries` or `ImgStack` objects.\n\nThe package is customizable and designed to easily incorporate modifications and additional, user-defined plugins (e.g. different type of analysis methods); see *Customize_Analysis.ipynb* and *Customize_Images.ipynb* in the `examples` folder.\n\nHow to install:\n\n```bash\npip install imgseries\n```\n\nThe package is under CeCILL license (equivalent to - and compatible with - GNU GPL, see below).\n\nQuick start\n===========\n\nBelow is some information to use the functions available in **imgseries**.\nFor more details and examples, please also consult docstrings and the Jupyter notebooks in the `examples` folder: *ImgSeries_Static.ipynb*, *ImgSeries_Interactive.ipynb*, *Analysis_GreyLevel.ipynb* and *Analysis_ContourTracking.ipynb*.\n\n\nThe management of file series, possibly spread out over multiple folders, follows the scheme of `filo.Series`. In particular, image files are attributed a unique `num` identifier that starts at 0 in the first folder. See `filo` documentation for details. The `ImgSeries` thus directly inherits from `filo.Series`.\n\n*Warning*\n\nIf running on a Windows machine and using the parallel option in some of the analysis codes, the call of the function must not be run during import of the python file containing the script (e.g. by using a `if __name__ == '__main__'` block). This is because in Windows, multiprocessing imports the main program when setting up processes, which causes recursive problems. The problem does not arise on Linux / MacOS.\n\n\n`ImgSeries`, `ImgStack`: general image series manipulation\n----------------------------------------------------------\n\nSee also the notebook with examples and details *ImgSeries.ipynb* in the `examples` folder.\n\n```python\nfrom imgseries import ImgSeries, series\n\n# ----------------------------------------------------------------------------\n# ======= WORKING WITH IMAGE SERIES (distinct, individual image files) =======\n# ----------------------------------------------------------------------------\n\n# EITHER:\nimages = ImgSeries(paths=['img1', 'img2'])  # implicitly, savepath is current directory\n# OR:\nimages = series(paths=['img1', 'img2'])\n# (the series() function is a bit more powerful than the ImgSeries class, as it\n# allows the user to select caching options for speed improvements, see below)\n\n# Image dimensions in x and y\nimages.nx, images.ny\n\n# Access individual images in the series -------------------------------------\n\nimages.files[10]       # filo.File object of image number num=10\nimages.files[10].file  # actual pathlib.Path file object\nimages.read(10)        # read image number num=10 into numpy array\nimages.show(10)        # show image in a matplotlib graph\n\n# Interactive views of image sequence ----------------------------------------\n\nimages.animate()       # see image series as a movie (start, end, skip options)\nimages.inspect()       # browse through image series with a slider (same options)\nimages.profile()         # object that also has inspect(), animate() methods etc.\n\n# Define display options (only for grayscale imagee --------------------------\n# (see details in notebook)\nimages.display.define('contrast')  # set vmin, vmax in imshow interactively\nimages.display.define('colormap')  # set cmap in imshow() interactively\n\n# Manually: (equivalent: images.display.limits = 0, 255)\nimages.display.vmin, images.display.vmax = 0, 255\nimages.display.cmap = 'viridis'\n\nimages.save_display()  # save rotation and crop parameters in a json file\nimages.load_display()  # load rotation and crop parameters from json file\n\n# Define global transform applied on all images (rotation + crop) ------------\n# (see details in notebook)\n\n# Note: the transforms to be considered and the order with which they are\n# applied on the images can be modified by passing the argument\n# transforms= in ImgSeries. For example:\n# images = series(transforms=('rotation', 'crop', 'filter'))\n\n# Interactive:\nimages.rotation.define()\nimages.crop.define()\nimages.filter.define()\nimages.threshold.define()\n\n# Manual:\nimages.grayscale.apply = True\nimages.rotation.angle = -70\nimages.crop.zone = (2, 25, 400, 600)\nimages.filter.size = 10\nimages.subtraction.reference = range(5)  # avg first 5 images for subtraction\nimages.subtraction.relative = True       # (I - Iref) / I_ref instead of I - Iref\nimages.threshold.vmin = 220  # everything below vmin is False, rest True\nimages.threshold.vmax = 240  # everything below vmax is True, rest False\n# Note: threshold.vmin can be combined with threshold.vmax for a bandpass\n\n# Other transform parameters / methods:\nimages.save_transforms()  # save rotation, crop etc. parameters in a json file\nimages.load_transforms()  # load rotation, crop etc. parameters from json file\nimages.active_transforms  # see currently applied transforms on images\nimages.reset_transforms()  # reset all transforms\n\n# Corrections can also be applied to image sequences, e.g. flicker and shaking\n# (See also Flicker analysis class, below)\n# Contrary to transforms, corrections can be\nimages.flicker.load()\nimages.save_corrections()\nimages.active_corrections  # see currently applied corrections on images\nimages.reset_corrections()  # reset all corrections\n\n# Exporting images (with transforms and/or corrections)\nimages.export()  # see examples/Export.ipynb for examples\n\n# Manage image timestamps ----------------------------------------------------\nimages.info  # see correspondence num / file info + automatically extracted image time\nimages.save_info()  # save above info in a csv file\nimages.load_info()  # Load info from previously saved csv data (overwrites images.files)\nimages.load_time('Time_File.txt')  # Keep images.files but update its time information with data from an external csv file.\n\n# ----------------------------------------------------------------------------\n# ===================== WORKING WITH A .TIFF IMAGE STACK =====================\n# ----------------------------------------------------------------------------\n\nimages = ImgSeries(stack='ImgStack.tif')\n\n# All methods/attributes above available, except those associated with timestamps\n```\n\n### Caching images for speed improvement\n\n```python\nimages = series(paths=['img1', 'img2'], cache=True)\nimages.inspect()  # inspection should be significantly faster\n```\nSee *ImgSeries_Caching.ipynb* for examples, details and options (cache size etc.).\nBy default, caching is disabled because it can lead to significant memory usage for large files.\n\n\n`GreyLevel`: average grey level analysis in image series\n--------------------------------------------------------\n\nFollow the average grey level (brightness) of one or more selected zones (default: whole image) on the image sequence.\nThe `GreyLevel` class accepts an image sequence (`ImgSeries` type, see above) as an input parameter. See also docstrings and the notebook with examples and details: *Analysis_GreyLevel.ipynb* in the `examples` folder.\n\n```python\nfrom imgseries import GreyLevel, GreyLevelResults\n\n# Create analysis object -----------------------------------------------------\ngl = GreyLevel(images)\n\n# Prepare and run analysis ---------------------------------------------------\n# NOTE: if no zones are defined, full image is taken as a default\ngl.zones.define()  # interactively select zones on image\ngl.zones.load()    # alternative to define() where zones are loaded from saved metadata\n\n# other alternative to load image series and analysis parameters from saved files\ngl.regenerate()\n\ngl.run()    # run actual analysis (parallel computation available);\ngl.results  # is an object containing data and metadata of the analysis\ngl.results.save()\n\n# Interactive views of results -----------------------------------------------\ngl.show()      # show result of analysis on a given image (default: first one)\ngl.animate()   # see results as a movie (start, end, skip options)\ngl.inspect()   # browse through results with a slider (same options)\n\n# Load analysis results afterwards (need save() to have been called) ---------\nresults = GreyLevelResults()\nresults.load()   # load analysis results (data + metadata)\nresults.data, results.metadata  # useful attributes\n```\n\n\n`ContourTracking`: object tracking using contours in image series\n-----------------------------------------------------------------\n\nFollow contours of iso-grey-level on image sequence. The `GreyLevel` class accepts an image sequence (`ImgSeries` type, see above) as an input parameter. See also docstrings and the notebook with examples and details: *Analysis_ContourTracking.ipynb* in the `examples` folder.\n\n```python\nfrom imgseries import ContourTracking, ContourTrackingResults\n\n# Create analysis object\nct = ContourTracking(images)\n\n# Prepare and run analysis ---------------------------------------------------\nct.threshold.define()  # interactively select threshold level\nct.contours.define()   # interactively select contours at the above level\nct.contours.load()     # alternative to define() where contours are loaded from saved metadata\n\n# other alternative to load image series and analysis parameters from saved files\nct.regenerate()\n\nct.run()      # run actual analysis (no parallel computation available)\nct.results    # is an object containing data and metadata of the analysis\nct.results.save()     # save results (data + metadata) to files (csv, json)\n\n# Interactive views of results -----------------------------------------------\nct.show()      # show result of analysis on a given image (default: first one)\nct.animate()   # see results as a movie (start, end, skip options)\nct.inspect()   # browse through results with a slider (same options)\n\n# Load analysis results afterwards (need save() to have been called) ---------\nresults = ContourTrackingResults()\nresults.load()   # load analysis results (data + metadata)\nresults.data, results.raw_contour_data, results.metadata  # useful attributes\n```\n\n`Front1D`: Analyze 1D propagating fronts with grey level analysis\n-----------------------------------------------------------------\n\nAnalyze fronts propagating in one direction (e.g., *x*), by averaging grey levels in the other direction (*y*). The program returns a line of pixel values along *x* as a function of time (i.e., a reslice of the data), where each pixel is an average of all other pixels along *y*. The operation and methods are similar to `GreyLevel` or ``ContourTracking` (see above). See also docstrings and the notebook with examples and details: *Analysis_Front1D.ipynb* in the `examples` folder.\n\n```python\nfrom imgseries import Front1D, Front1DResults\nf1d = Front1D(images)\nf1d.run()\n```\n\n\n`Flicker`: Get image flicker from grey level variations on a zone\n-----------------------------------------------------------------\n\nAnalyze flicker on images based on the average gray level variation in a reference zone in the image. The operation and methods are very similar to `GreyLevel`, including reference zone definition (see above). See also docstrings and the notebook with examples and details: *Analysis_Flicker.ipynb* in the `examples` folder.\n\n```python\nfrom imgseries import Flicker, FlickerResults\nflick = Flicker(images)\nflick.zones.define()\nflick.run()\n```\n\nThe results are stored as a ratio, which is by how much the pixel values in the image have to be divided to remove apparent flicker.\n\nAfterwards, these results can be loaded in the image series to correct flicker automatically (as a *corrections* parameter):\n```python\nimages.flicker.load()\n```\n\n\n# Requirements / dependencies\n\n## Python packages\n\n(installed by pip automatically if necessary)\n- skimage (scikit-image)\n- matplotlib\n- numpy\n- importlib-metadata\n- tqdm (waitbars)\n- filo (file series management) >= 1.1\n- gittools (get git commit info) >= 0.5\n- imgbasics (basic image processing) >= 0.3.0\n- drapo (interactive tools for matplotlib figures) >= 1.2.1\n\n\n## Python version\n- Python >= 3.6 because of f-string formatting\n\n# Author\n\nOlivier Vincent\n\n(ovinc.py@mgmail.com)\n\n# License\n\nThis software is under the CeCILL-2.1 license, equivalent to GNU-GPL (see https://cecill.info/)\n\nCopyright Olivier Vincent (2021-2024)\n(ovinc.py@gmail.com)\n\nThis software is a computer program whose purpose is to provide tools for\ninspection and analysis of image sequences\n(either as individual files or as stacks).\n\nThis software is governed by the CeCILL license under French law and\nabiding by the rules of distribution of free software. You can  use,\nmodify and/ or redistribute the software under the terms of the CeCILL\nlicense as circulated by CEA, CNRS and INRIA at the following URL\n\"http://www.cecill.info\".\n\nAs a counterpart to the access to the source code and rights to copy,\nmodify and redistribute granted by the license, users are provided only\nwith a limited warranty  and the software's author, the holder of the\neconomic rights, and the successive licensors have only limited\nliability.\n\nIn this respect, the user's attention is drawn to the risks associated\nwith loading, using, modifying and/or developing or reproducing the\nsoftware by the user in light of its specific status of free software,\nthat may mean that it is complicated to manipulate, and that also\ntherefore means that it is reserved for developers and experienced\nprofessionals having in-depth computer knowledge. Users are therefore\nencouraged to load and test the software's suitability as regards their\nrequirements in conditions enabling the security of their systems and/or\ndata to be ensured and, more generally, to use and operate it in the\nsame conditions as regards security.\n\nThe fact that you are presently reading this means that you have had\nknowledge of the CeCILL license and that you accept its terms.\n\n  CeCILL FREE SOFTWARE LICENSE AGREEMENT\n\nVersion 2.1 dated 2013-06-21\n\n\n    Notice\n\nThis Agreement is a Free Software license agreement that is the result\nof discussions between its authors in order to ensure compliance with\nthe two main principles guiding its drafting:\n\n  * firstly, compliance with the principles governing the distribution\n    of Free Software: access to source code, broad rights granted to users,\n  * secondly, the election of a governing law, French law, with which it\n    is conformant, both as regards the law of torts and intellectual\n    property law, and the protection that it offers to both authors and\n    holders of the economic rights over software.\n\nThe authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])\nlicense are:\n\nCommissariat \u00e0 l'\u00e9nergie atomique et aux \u00e9nergies alternatives - CEA, a\npublic scientific, technical and industrial research establishment,\nhaving its principal place of business at 25 rue Leblanc, immeuble Le\nPonant D, 75015 Paris, France.\n\nCentre National de la Recherche Scientifique - CNRS, a public scientific\nand technological establishment, having its principal place of business\nat 3 rue Michel-Ange, 75794 Paris cedex 16, France.\n\nInstitut National de Recherche en Informatique et en Automatique -\nInria, a public scientific and technological establishment, having its\nprincipal place of business at Domaine de Voluceau, Rocquencourt, BP\n105, 78153 Le Chesnay cedex, France.\n\n\n    Preamble\n\nThe purpose of this Free Software license agreement is to grant users\nthe right to modify and redistribute the software governed by this\nlicense within the framework of an open source distribution model.\n\nThe exercising of this right is conditional upon certain obligations for\nusers so as to preserve this status for all subsequent redistributions.\n\nIn consideration of access to the source code and the rights to copy,\nmodify and redistribute granted by the license, users are provided only\nwith a limited warranty and the software's author, the holder of the\neconomic rights, and the successive licensors only have limited liability.\n\nIn this respect, the risks associated with loading, using, modifying\nand/or developing or reproducing the software by the user are brought to\nthe user's attention, given its Free Software status, which may make it\ncomplicated to use, with the result that its use is reserved for\ndevelopers and experienced professionals having in-depth computer\nknowledge. Users are therefore encouraged to load and test the\nsuitability of the software as regards their requirements in conditions\nenabling the security of their systems and/or data to be ensured and,\nmore generally, to use and operate it in the same conditions of\nsecurity. This Agreement may be freely reproduced and published,\nprovided it is not altered, and that no provisions are either added or\nremoved herefrom.\n\nThis Agreement may apply to any or all software for which the holder of\nthe economic rights decides to submit the use thereof to its provisions.\n\nFrequently asked questions can be found on the official website of the\nCeCILL licenses family (http://www.cecill.info/index.en.html) for any\nnecessary clarification.\n\n\n    Article 1 - DEFINITIONS\n\nFor the purpose of this Agreement, when the following expressions\ncommence with a capital letter, they shall have the following meaning:\n\nAgreement: means this license agreement, and its possible subsequent\nversions and annexes.\n\nSoftware: means the software in its Object Code and/or Source Code form\nand, where applicable, its documentation, \"as is\" when the Licensee\naccepts the Agreement.\n\nInitial Software: means the Software in its Source Code and possibly its\nObject Code form and, where applicable, its documentation, \"as is\" when\nit is first distributed under the terms and conditions of the Agreement.\n\nModified Software: means the Software modified by at least one\nContribution.\n\nSource Code: means all the Software's instructions and program lines to\nwhich access is required so as to modify the Software.\n\nObject Code: means the binary files originating from the compilation of\nthe Source Code.\n\nHolder: means the holder(s) of the economic rights over the Initial\nSoftware.\n\nLicensee: means the Software user(s) having accepted the Agreement.\n\nContributor: means a Licensee having made at least one Contribution.\n\nLicensor: means the Holder, or any other individual or legal entity, who\ndistributes the Software under the Agreement.\n\nContribution: means any or all modifications, corrections, translations,\nadaptations and/or new functions integrated into the Software by any or\nall Contributors, as well as any or all Internal Modules.\n\nModule: means a set of sources files including their documentation that\nenables supplementary functions or services in addition to those offered\nby the Software.\n\nExternal Module: means any or all Modules, not derived from the\nSoftware, so that this Module and the Software run in separate address\nspaces, with one calling the other when they are run.\n\nInternal Module: means any or all Module, connected to the Software so\nthat they both execute in the same address space.\n\nGNU GPL: means the GNU General Public License version 2 or any\nsubsequent version, as published by the Free Software Foundation Inc.\n\nGNU Affero GPL: means the GNU Affero General Public License version 3 or\nany subsequent version, as published by the Free Software Foundation Inc.\n\nEUPL: means the European Union Public License version 1.1 or any\nsubsequent version, as published by the European Commission.\n\nParties: mean both the Licensee and the Licensor.\n\nThese expressions may be used both in singular and plural form.\n\n\n    Article 2 - PURPOSE\n\nThe purpose of the Agreement is the grant by the Licensor to the\nLicensee of a non-exclusive, transferable and worldwide license for the\nSoftware as set forth in Article 5 <#scope> hereinafter for the whole\nterm of the protection granted by the rights over said Software.\n\n\n    Article 3 - ACCEPTANCE\n\n3.1 The Licensee shall be deemed as having accepted the terms and\nconditions of this Agreement upon the occurrence of the first of the\nfollowing events:\n\n  * (i) loading the Software by any or all means, notably, by\n    downloading from a remote server, or by loading from a physical medium;\n  * (ii) the first time the Licensee exercises any of the rights granted\n    hereunder.\n\n3.2 One copy of the Agreement, containing a notice relating to the\ncharacteristics of the Software, to the limited warranty, and to the\nfact that its use is restricted to experienced users has been provided\nto the Licensee prior to its acceptance as set forth in Article 3.1\n<#accepting> hereinabove, and the Licensee hereby acknowledges that it\nhas read and understood it.\n\n\n    Article 4 - EFFECTIVE DATE AND TERM\n\n\n      4.1 EFFECTIVE DATE\n\nThe Agreement shall become effective on the date when it is accepted by\nthe Licensee as set forth in Article 3.1 <#accepting>.\n\n\n      4.2 TERM\n\nThe Agreement shall remain in force for the entire legal term of\nprotection of the economic rights over the Software.\n\n\n    Article 5 - SCOPE OF RIGHTS GRANTED\n\nThe Licensor hereby grants to the Licensee, who accepts, the following\nrights over the Software for any or all use, and for the term of the\nAgreement, on the basis of the terms and conditions set forth hereinafter.\n\nBesides, if the Licensor owns or comes to own one or more patents\nprotecting all or part of the functions of the Software or of its\ncomponents, the Licensor undertakes not to enforce the rights granted by\nthese patents against successive Licensees using, exploiting or\nmodifying the Software. If these patents are transferred, the Licensor\nundertakes to have the transferees subscribe to the obligations set\nforth in this paragraph.\n\n\n      5.1 RIGHT OF USE\n\nThe Licensee is authorized to use the Software, without any limitation\nas to its fields of application, with it being hereinafter specified\nthat this comprises:\n\n 1. permanent or temporary reproduction of all or part of the Software\n    by any or all means and in any or all form.\n\n 2. loading, displaying, running, or storing the Software on any or all\n    medium.\n\n 3. entitlement to observe, study or test its operation so as to\n    determine the ideas and principles behind any or all constituent\n    elements of said Software. This shall apply when the Licensee\n    carries out any or all loading, displaying, running, transmission or\n    storage operation as regards the Software, that it is entitled to\n    carry out hereunder.\n\n\n      5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS\n\nThe right to make Contributions includes the right to translate, adapt,\narrange, or make any or all modifications to the Software, and the right\nto reproduce the resulting software.\n\nThe Licensee is authorized to make any or all Contributions to the\nSoftware provided that it includes an explicit notice that it is the\nauthor of said Contribution and indicates the date of the creation thereof.\n\n\n      5.3 RIGHT OF DISTRIBUTION\n\nIn particular, the right of distribution includes the right to publish,\ntransmit and communicate the Software to the general public on any or\nall medium, and by any or all means, and the right to market, either in\nconsideration of a fee, or free of charge, one or more copies of the\nSoftware by any means.\n\nThe Licensee is further authorized to distribute copies of the modified\nor unmodified Software to third parties according to the terms and\nconditions set forth hereinafter.\n\n\n        5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION\n\nThe Licensee is authorized to distribute true copies of the Software in\nSource Code or Object Code form, provided that said distribution\ncomplies with all the provisions of the Agreement and is accompanied by:\n\n 1. a copy of the Agreement,\n\n 2. a notice relating to the limitation of both the Licensor's warranty\n    and liability as set forth in Articles 8 and 9,\n\nand that, in the event that only the Object Code of the Software is\nredistributed, the Licensee allows effective access to the full Source\nCode of the Software for a period of at least three years from the\ndistribution of the Software, it being understood that the additional\nacquisition cost of the Source Code shall not exceed the cost of the\ndata transfer.\n\n\n        5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE\n\nWhen the Licensee makes a Contribution to the Software, the terms and\nconditions for the distribution of the resulting Modified Software\nbecome subject to all the provisions of this Agreement.\n\nThe Licensee is authorized to distribute the Modified Software, in\nsource code or object code form, provided that said distribution\ncomplies with all the provisions of the Agreement and is accompanied by:\n\n 1. a copy of the Agreement,\n\n 2. a notice relating to the limitation of both the Licensor's warranty\n    and liability as set forth in Articles 8 and 9,\n\nand, in the event that only the object code of the Modified Software is\nredistributed,\n\n 3. a note stating the conditions of effective access to the full source\n    code of the Modified Software for a period of at least three years\n    from the distribution of the Modified Software, it being understood\n    that the additional acquisition cost of the source code shall not\n    exceed the cost of the data transfer.\n\n\n        5.3.3 DISTRIBUTION OF EXTERNAL MODULES\n\nWhen the Licensee has developed an External Module, the terms and\nconditions of this Agreement do not apply to said External Module, that\nmay be distributed under a separate license agreement.\n\n\n        5.3.4 COMPATIBILITY WITH OTHER LICENSES\n\nThe Licensee can include a code that is subject to the provisions of one\nof the versions of the GNU GPL, GNU Affero GPL and/or EUPL in the\nModified or unmodified Software, and distribute that entire code under\nthe terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL.\n\nThe Licensee can include the Modified or unmodified Software in a code\nthat is subject to the provisions of one of the versions of the GNU GPL,\nGNU Affero GPL and/or EUPL and distribute that entire code under the\nterms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL.\n\n\n    Article 6 - INTELLECTUAL PROPERTY\n\n\n      6.1 OVER THE INITIAL SOFTWARE\n\nThe Holder owns the economic rights over the Initial Software. Any or\nall use of the Initial Software is subject to compliance with the terms\nand conditions under which the Holder has elected to distribute its work\nand no one shall be entitled to modify the terms and conditions for the\ndistribution of said Initial Software.\n\nThe Holder undertakes that the Initial Software will remain ruled at\nleast by this Agreement, for the duration set forth in Article 4.2 <#term>.\n\n\n      6.2 OVER THE CONTRIBUTIONS\n\nThe Licensee who develops a Contribution is the owner of the\nintellectual property rights over this Contribution as defined by\napplicable law.\n\n\n      6.3 OVER THE EXTERNAL MODULES\n\nThe Licensee who develops an External Module is the owner of the\nintellectual property rights over this External Module as defined by\napplicable law and is free to choose the type of agreement that shall\ngovern its distribution.\n\n\n      6.4 JOINT PROVISIONS\n\nThe Licensee expressly undertakes:\n\n 1. not to remove, or modify, in any manner, the intellectual property\n    notices attached to the Software;\n\n 2. to reproduce said notices, in an identical manner, in the copies of\n    the Software modified or not.\n\nThe Licensee undertakes not to directly or indirectly infringe the\nintellectual property rights on the Software of the Holder and/or\nContributors, and to take, where applicable, vis-\u00e0-vis its staff, any\nand all measures required to ensure respect of said intellectual\nproperty rights of the Holder and/or Contributors.\n\n\n    Article 7 - RELATED SERVICES\n\n7.1 Under no circumstances shall the Agreement oblige the Licensor to\nprovide technical assistance or maintenance services for the Software.\n\nHowever, the Licensor is entitled to offer this type of services. The\nterms and conditions of such technical assistance, and/or such\nmaintenance, shall be set forth in a separate instrument. Only the\nLicensor offering said maintenance and/or technical assistance services\nshall incur liability therefor.\n\n7.2 Similarly, any Licensor is entitled to offer to its licensees, under\nits sole responsibility, a warranty, that shall only be binding upon\nitself, for the redistribution of the Software and/or the Modified\nSoftware, under terms and conditions that it is free to decide. Said\nwarranty, and the financial terms and conditions of its application,\nshall be subject of a separate instrument executed between the Licensor\nand the Licensee.\n\n\n    Article 8 - LIABILITY\n\n8.1 Subject to the provisions of Article 8.2, the Licensee shall be\nentitled to claim compensation for any direct loss it may have suffered\nfrom the Software as a result of a fault on the part of the relevant\nLicensor, subject to providing evidence thereof.\n\n8.2 The Licensor's liability is limited to the commitments made under\nthis Agreement and shall not be incurred as a result of in particular:\n(i) loss due the Licensee's total or partial failure to fulfill its\nobligations, (ii) direct or consequential loss that is suffered by the\nLicensee due to the use or performance of the Software, and (iii) more\ngenerally, any consequential loss. In particular the Parties expressly\nagree that any or all pecuniary or business loss (i.e. loss of data,\nloss of profits, operating loss, loss of customers or orders,\nopportunity cost, any disturbance to business activities) or any or all\nlegal proceedings instituted against the Licensee by a third party,\nshall constitute consequential loss and shall not provide entitlement to\nany or all compensation from the Licensor.\n\n\n    Article 9 - WARRANTY\n\n9.1 The Licensee acknowledges that the scientific and technical\nstate-of-the-art when the Software was distributed did not enable all\npossible uses to be tested and verified, nor for the presence of\npossible defects to be detected. In this respect, the Licensee's\nattention has been drawn to the risks associated with loading, using,\nmodifying and/or developing and reproducing the Software which are\nreserved for experienced users.\n\nThe Licensee shall be responsible for verifying, by any or all means,\nthe suitability of the product for its requirements, its good working\norder, and for ensuring that it shall not cause damage to either persons\nor properties.\n\n9.2 The Licensor hereby represents, in good faith, that it is entitled\nto grant all the rights over the Software (including in particular the\nrights set forth in Article 5 <#scope>).\n\n9.3 The Licensee acknowledges that the Software is supplied \"as is\" by\nthe Licensor without any other express or tacit warranty, other than\nthat provided for in Article 9.2 <#good-faith> and, in particular,\nwithout any warranty as to its commercial value, its secured, safe,\ninnovative or relevant nature.\n\nSpecifically, the Licensor does not warrant that the Software is free\nfrom any error, that it will operate without interruption, that it will\nbe compatible with the Licensee's own equipment and software\nconfiguration, nor that it will meet the Licensee's requirements.\n\n9.4 The Licensor does not either expressly or tacitly warrant that the\nSoftware does not infringe any third party intellectual property right\nrelating to a patent, software or any other property right. Therefore,\nthe Licensor disclaims any and all liability towards the Licensee\narising out of any or all proceedings for infringement that may be\ninstituted in respect of the use, modification and redistribution of the\nSoftware. Nevertheless, should such proceedings be instituted against\nthe Licensee, the Licensor shall provide it with technical and legal\nexpertise for its defense. Such technical and legal expertise shall be\ndecided on a case-by-case basis between the relevant Licensor and the\nLicensee pursuant to a memorandum of understanding. The Licensor\ndisclaims any and all liability as regards the Licensee's use of the\nname of the Software. No warranty is given as regards the existence of\nprior rights over the name of the Software or as regards the existence\nof a trademark.\n\n\n    Article 10 - TERMINATION\n\n10.1 In the event of a breach by the Licensee of its obligations\nhereunder, the Licensor may automatically terminate this Agreement\nthirty (30) days after notice has been sent to the Licensee and has\nremained ineffective.\n\n10.2 A Licensee whose Agreement is terminated shall no longer be\nauthorized to use, modify or distribute the Software. However, any\nlicenses that it may have granted prior to termination of the Agreement\nshall remain valid subject to their having been granted in compliance\nwith the terms and conditions hereof.\n\n\n    Article 11 - MISCELLANEOUS\n\n\n      11.1 EXCUSABLE EVENTS\n\nNeither Party shall be liable for any or all delay, or failure to\nperform the Agreement, that may be attributable to an event of force\nmajeure, an act of God or an outside cause, such as defective\nfunctioning or interruptions of the electricity or telecommunications\nnetworks, network paralysis following a virus attack, intervention by\ngovernment authorities, natural disasters, water damage, earthquakes,\nfire, explosions, strikes and labor unrest, war, etc.\n\n11.2 Any failure by either Party, on one or more occasions, to invoke\none or more of the provisions hereof, shall under no circumstances be\ninterpreted as being a waiver by the interested Party of its right to\ninvoke said provision(s) subsequently.\n\n11.3 The Agreement cancels and replaces any or all previous agreements,\nwhether written or oral, between the Parties and having the same\npurpose, and constitutes the entirety of the agreement between said\nParties concerning said purpose. No supplement or modification to the\nterms and conditions hereof shall be effective as between the Parties\nunless it is made in writing and signed by their duly authorized\nrepresentatives.\n\n11.4 In the event that one or more of the provisions hereof were to\nconflict with a current or future applicable act or legislative text,\nsaid act or legislative text shall prevail, and the Parties shall make\nthe necessary amendments so as to comply with said act or legislative\ntext. All other provisions shall remain effective. Similarly, invalidity\nof a provision of the Agreement, for any reason whatsoever, shall not\ncause the Agreement as a whole to be invalid.\n\n\n      11.5 LANGUAGE\n\nThe Agreement is drafted in both French and English and both versions\nare deemed authentic.\n\n\n    Article 12 - NEW VERSIONS OF THE AGREEMENT\n\n12.1 Any person is authorized to duplicate and distribute copies of this\nAgreement.\n\n12.2 So as to ensure coherence, the wording of this Agreement is\nprotected and may only be modified by the authors of the License, who\nreserve the right to periodically publish updates or new versions of the\nAgreement, each with a separate number. These subsequent versions may\naddress new issues encountered by Free Software.\n\n12.3 Any Software distributed under a given version of the Agreement may\nonly be subsequently distributed under the same version of the Agreement\nor a subsequent version, subject to the provisions of Article 5.3.4\n<#compatibility>.\n\n\n    Article 13 - GOVERNING LAW AND JURISDICTION\n\n13.1 The Agreement is governed by French law. The Parties agree to\nendeavor to seek an amicable solution to any disagreements or disputes\nthat may arise during the performance of the Agreement.\n\n13.2 Failing an amicable solution within two (2) months as from their\noccurrence, and unless emergency proceedings are necessary, the\ndisagreements or disputes shall be referred to the Paris Courts having\njurisdiction, by the more diligent Party.\n",
    "bugtrack_url": null,
    "license": "CeCILL-2.1",
    "summary": "Image inspection and analysis tools for image series",
    "version": "0.7.3",
    "project_urls": {
        "Homepage": "https://github.com/ovinc/imgseries"
    },
    "split_keywords": [
        "image",
        " analysis",
        " inspection",
        " series",
        " contour",
        " tracking",
        " grey",
        " level",
        " gray"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e29bbddcb872edf482334f45667f639c63c133947a3d46c80899ee9df3fcbf29",
                "md5": "9336dd204ff796a0d57d39e9f0b6a151",
                "sha256": "5beec6d820b1d6c68493f3421665b9d535171d9fb3596e5554da894b7fc1117b"
            },
            "downloads": -1,
            "filename": "imgseries-0.7.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9336dd204ff796a0d57d39e9f0b6a151",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 64902,
            "upload_time": "2024-05-17T14:38:55",
            "upload_time_iso_8601": "2024-05-17T14:38:55.051730Z",
            "url": "https://files.pythonhosted.org/packages/e2/9b/bddcb872edf482334f45667f639c63c133947a3d46c80899ee9df3fcbf29/imgseries-0.7.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "570e55bc5459ec764b2665b6678fbee59acf57afbb0101d651ffccd1dd860067",
                "md5": "fbc6e466e38ce9d3df89ec287d731750",
                "sha256": "e19920c3a44a2f64bbf70e80eb025685664961ee8ea5c149bf2140d37aef55e4"
            },
            "downloads": -1,
            "filename": "imgseries-0.7.3.tar.gz",
            "has_sig": false,
            "md5_digest": "fbc6e466e38ce9d3df89ec287d731750",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 23301017,
            "upload_time": "2024-05-17T14:41:10",
            "upload_time_iso_8601": "2024-05-17T14:41:10.634876Z",
            "url": "https://files.pythonhosted.org/packages/57/0e/55bc5459ec764b2665b6678fbee59acf57afbb0101d651ffccd1dd860067/imgseries-0.7.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-17 14:41:10",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ovinc",
    "github_project": "imgseries",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "imgseries"
}
        
Elapsed time: 7.03148s