Stickleback landmarks#

For a more detailed description see:

import phenopype as pp
import os 

## my root directory - modify as you see fit 

## my laptop has a small screen, so I use a smaller phenopype window
pp._config.window_max_dim = 800

Make phenopype project#

Create a phenopype project (remember, Project is used to both create new projects, and load existing ones). Different phenopype projects can be useful, e.g., to process different batches of images from field seasons, perspectives, etc,. It makes sense to create them side by side in a subfolder, which I call “phenopype”. Thus, my research projects often have the following directory structure (just my way of working - this is really totally up to you):

    data                       # processed data (e.g., tables)
    data_raw                   # raw data (images, videos, etc.)
    phenopype                  # phenopype projects
    phenopype_templates        # phenopype .yaml config templates
    scripts                    # python, R, etc.
    [...]                      # manuscripts, figures, literature, etc.
proj = pp.Project(r"phenopype\stickleback-landmarks")
proj.add_files(image_dir = r"data_raw\stickleback-landmarks", exclude="side")
proj.add_config(template_path=r"phenopype_templates\stickleback-landmarks_template1.yaml", tag="v1")

Next we need to add information from a reference image to provide a project wide px-to-mm scale, which we will need to adjust our landmark coordinate space. This is important if for example the distance between the camera and your sample changes.#

## set the project-wide reference. the reference has its own tag, in case your project uses multiple reference cards
proj.add_reference(reference_image_path= os.path.join(r"data_raw\stickleback-landmarks","stickleback_side.jpg"), reference_tag="stickle-scale")

You can modify, for instance, point size and colour for the landmarks while adding them (or before adding the template). Note that point characteristics need to be changed separately for setting the landmarks and visualizing them (this goes for all GUI-annotations like masks, lines, etc.).#

## run image processing
for path in proj.dir_paths:
    pp.Pype(path, tag="v1")
proj.collect_results(files=["canvas", "landmark"], tag="v1", aggregate_csv=True, overwrite=True)