Examples

FlowCam

"""Process FlowCam data using MorphoCut and store as EcoTaxa archive."""

import os

from morphocut import Pipeline
from morphocut.contrib.ecotaxa import EcotaxaWriter
from morphocut.contrib.zooprocess import CalculateZooProcessFeatures
from morphocut.file import Find
from morphocut.image import ImageProperties, RGB2Gray
from morphocut.integration.flowcam import FlowCamReader
from morphocut.str import Format
from morphocut.stream import TQDM

import_path = "../tests/data/flowcam"
out_folder = "flowcam_out"
os.makedirs(out_folder, exist_ok=True)

if __name__ == "__main__":
    print("Processing images under {}...".format(import_path))

    # All operations are inserted into a pipeline and are only executed when Pipeline.run() is called.
    with Pipeline() as p:
        # Find .lst files in import_path
        lst_fn = Find(import_path, [".lst"])

        # Display a progress indicator for the .lst files
        TQDM(lst_fn)

        # Read objects from a .lst file
        obj = FlowCamReader(lst_fn)

        # Extract object image and convert to graylevel
        img = obj.image
        img_gray = RGB2Gray(img, True)

        # Extract object mask
        mask = obj.mask

        # Extract metadata from the FlowCam
        object_meta = obj.data

        # Construct object ID
        object_id = Format(
            "{lst_name}_{id}", lst_name=obj.lst_name, _kwargs=object_meta
        )
        object_meta["id"] = object_id

        # Calculate object properties (area, eccentricity, equivalent_diameter, mean_intensity, ...). See skimage.measure.regionprops.
        regionprops = ImageProperties(mask, img_gray)
        # Append object properties to metadata in a ZooProcess-like format
        object_meta = CalculateZooProcessFeatures(regionprops, object_meta)

        # Write each object to an EcoTaxa archive.
        # Here, three different versions are written. Remove what you do not need.
        EcotaxaWriter(
            os.path.join(out_folder, "export.zip"),
            [
                # The original RGB image
                (Format("{object_id}.jpg", object_id=object_id), img),
                # A graylevel version
                (Format("{object_id}_gray.jpg", object_id=object_id), img_gray),
                # The binary mask
                (Format("{object_id}_mask.jpg", object_id=object_id), mask),
            ],
            object_meta=object_meta,
        )

        # Display progress indicator for individual objects
        TQDM(object_id)

    p.run()

Video

"""Process video data using MorphoCut and store frames as individual frames."""

from morphocut import Pipeline
from morphocut.image import ImageWriter
from morphocut.pims import VideoReader
from morphocut.str import Format

with Pipeline() as p:
    # Read individual frames from a video file
    frame = VideoReader("/path/to/video.avi")

    # Format filename
    filename = Format("/output/path/frame_#{}.png", frame.frame_no)

    # Write individual frames as image files
    ImageWriter(filename, frame)

p.run()