| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # -*- coding: utf-8 -*-
- # imageio is distributed under the terms of the (new) BSD License.
- """Read TIFF from FEI SEM microscopes.
- Backend Library: internal
- This format is based on :mod:`TIFF <imageio.plugins.tifffile>`, and supports the
- same parameters. FEI microscopes append metadata as ASCII text at the end of the
- file, which this reader correctly extracts.
- Parameters
- ----------
- discard_watermark : bool
- If True (default), discard the bottom rows of the image, which
- contain no image data, only a watermark with metadata.
- watermark_height : int
- The height in pixels of the FEI watermark. The default is 70.
- See Also
- --------
- :mod:`imageio.plugins.tifffile`
- """
- from .tifffile import TiffFormat
- class FEISEMFormat(TiffFormat):
- """See :mod:`imageio.plugins.feisem`"""
- def _can_write(self, request):
- return False # FEI-SEM only supports reading
- class Reader(TiffFormat.Reader):
- def _get_data(self, index=0, discard_watermark=True, watermark_height=70):
- """Get image and metadata from given index.
- FEI images usually (always?) contain a watermark at the
- bottom of the image, 70 pixels high. We discard this by
- default as it does not contain any information not present
- in the metadata.
- """
- im, meta = super(FEISEMFormat.Reader, self)._get_data(index)
- if discard_watermark:
- im = im[:-watermark_height]
- return im, meta
- def _get_meta_data(self, index=None):
- """Read the metadata from an FEI SEM TIFF.
- This metadata is included as ASCII text at the end of the file.
- The index, if provided, is ignored.
- Returns
- -------
- metadata : dict
- Dictionary of metadata.
- """
- if hasattr(self, "_fei_meta"):
- return self._fei_meta
- md = {"root": {}}
- current_tag = "root"
- reading_metadata = False
- filename = self.request.get_local_filename()
- with open(filename, encoding="utf8", errors="ignore") as fin:
- for line in fin:
- if not reading_metadata:
- if not line.startswith("Date="):
- continue
- else:
- reading_metadata = True
- line = line.rstrip()
- if line.startswith("["):
- current_tag = line.lstrip("[").rstrip("]")
- md[current_tag] = {}
- else:
- if "=" in line: # ignore empty and irrelevant lines
- key, val = line.split("=", maxsplit=1)
- for tag_type in (int, float):
- try:
- val = tag_type(val)
- except ValueError:
- continue
- else:
- break
- md[current_tag][key] = val
- if not md["root"] and len(md) == 1:
- raise ValueError("Input file %s contains no FEI metadata." % filename)
- self._fei_meta = md
- return md
|