Skip to content

Commit

Permalink
Add acitivity to open CZI image, #720
Browse files Browse the repository at this point in the history
  • Loading branch information
tischi committed Sep 8, 2024
1 parent 7643e6c commit 4fa27c8
Show file tree
Hide file tree
Showing 9 changed files with 214 additions and 10 deletions.
9 changes: 9 additions & 0 deletions _includes/image_file_formats/open_czi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<h4 id="open_czi"><a href="#open_czi">Open CZI image data</a></h4>

- Open a CZI (Carl Zeiss Image) file and inspect its pixel and metatdata content
- Observe the data is presented as one file on disk
- Observe that this one file contains multiple image datasets

##### Data

- [CZI image file](https://github.com/NEUBIAS/training-resources/raw/master/image_data/xyz__multiple_images.czi)
183 changes: 183 additions & 0 deletions _includes/image_file_formats/open_czi_bioio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# %%
# Open a CZI image file
# minimal conda env for this module
# conda create -n ImageFileFormats python=3.10
# activate ImageFileFormat
# pip install bioio bioio-tifffile bioio-lif bioio-czi bioio-ome-tiff bioio-ome-zarr notebook

# TODO
# - Change the below code to only open the CZI image
# - Implement that it opens both images that are contained in the file (see ImageJ GUI activity)

# %%
# Load .tif file with minimal metadata
# - Observe that BioImage chooses the correct reader plugin
# - Observe that the return object is not the image matrix
from bioio import BioImage
image_url = 'https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_8bit__nuclei_PLK1_control.tif'
bioimage = BioImage(image_url)
print(bioimage)
print(type(bioimage))

# %%
# Print some onject attributes
# - Observe that the object is 5 dimensional with most dimensions being empty
# - Observe that the dimension order is always time, channel, z, y, x, (TCZYX)
print(bioimage.dims)
print(bioimage.shape)
print(f'Dimension order is: {bioimage.dims.order}')
print(type(bioimage.dims.order))
print(f'Size of X dimension is: {bioimage.dims.X}')

# %%
# Extract image data
# - Observe that the returned numpy.array is still 5 dimensional
image_data = bioimage.data
print(type(image_data))
print(image_data)
print(image_data.shape)

# %%
# Extract specific part of image data
# - Observe that numpy.array is reduced to populated dimensions only
yx_image_data = bioimage.get_image_data('YX')
print(type(yx_image_data))
print(yx_image_data)
print(yx_image_data.shape)

# %%
# Access pixel size
import numpy as np
print(bioimage.physical_pixel_sizes)
print(f'An pixel has a length of {np.round(bioimage.physical_pixel_sizes.X,2)} microns in X dimension.')

# %%
# Access general metadata
print(type(bioimage.metadata))
print(bioimage.metadata)

# %%
# Load .tif file with extensive metadata
image_url = "https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_16bit__collagen.md.tif"
bioimage = BioImage(image_url)
print(bioimage)
print(type(bioimage))

# - Observe that the image is larger than the previous
print(bioimage.dims)

# %%
# Access image and reduce to only populated dimensions
yx_image_data = bioimage.data.squeeze()
print(type(yx_image_data))
print(yx_image_data)
print(yx_image_data.shape)

# %%
# Access pixel size
print(bioimage.physical_pixel_sizes)
print(f'An pixel has a length of {np.round(bioimage.physical_pixel_sizes.Y,2)} microns in Y dimension.')

# Access general metadata
# - Observe that metadata are more extensive than in the previous image
print(type(bioimage.metadata))
print(bioimage.metadata)

# %%
# Load .lif file
# - Observe that BioImage chooses the correct reader plugin
# - Observe that the return object has 4 different channels
# - Observe that the general metadata are an abstract element
image_url = "https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_xyc__two_images.lif"
bioimage = BioImage(image_url)
print(bioimage)
print(type(bioimage))
print(bioimage.dims)
print(bioimage.metadata)
print(type(bioimage.metadata))

# %%
# Access channel information
print(bioimage.channel_names)

# %%
# Access image data for all channels
img_4channel = bioimage.data.squeeze()

# Alternative
img_4channel = bioimage.get_image_data('CYX')

# - Observe that numpy.array shape is 3 dimensional representing channel,y,x
print(img_4channel.shape)

# Access only one channel
img_1channel = bioimage.get_image_data('YX',C=0)

# Alternative
img_1channel = img_4channel[0]

# - Observe that numpy.array shape is 2 dimensional representing y,x
print(img_1channel.shape)

# %%
# Access different images in one image file (scenes)
# - Observe that one image file can contain several scenes
# - Observe that they can be different in various aspects
print(bioimage.scenes)
print(f'Current scene: {bioimage.current_scene}')

# - Observe that the image in the current scene as 4 channel and Y/X dimensions have the size of 1024
print(bioimage.dims)
print(bioimage.physical_pixel_sizes)

# Switch to second scene
# - Observe that the image in the other scene as only one channel and Y/X dimensions are half as large as the first scene
# - Observe that the pixel sizes are doubled
bioimage.set_scene(1)
print(bioimage.dims)
print(bioimage.physical_pixel_sizes)

# %%
# Load .czi file
# file needs first to be downloaded from https://github.com/NEUBIAS/training-resources/raw/master/image_data/xyz__multiple_images.czi
# save file in the same directory as this notebook
# - Observe that BioImage chooses the correct reader plugin
# - Observe that the return object has a z dimension
bioimage = BioImage('/Users/fschneider/skimage-napari-tutorial/ExampleImages/xyz__multiple_images.czi')
print(bioimage)
print(type(bioimage))

# %%
# little excersise in between
# Access image dimensions
print(bioimage.dims)

# Access general metadata
# - Observe that metadata are abstract
print(bioimage.metadata)
print(type(bioimage.metadata))

# Access pixel size
print(bioimage.physical_pixel_sizes)

# Access image data for all channels
img_3d = bioimage.data.squeeze()

# Alternative
img_3d = bioimage.get_image_data('ZYX')

# - Observe that numpy.array shape is 3 dimensional representing z,y,x
print(img_3d.shape)

# Access only one channel
img_2d = bioimage.get_image_data('YX',Z=0)

# Alternative
img_2d = img_3d[0]

# - Observe that numpy.array shape is 2 dimensional representing y,x
print(img_2d.shape)

# %%
# little excercise:
# paticipants should try to open one of their files with python
8 changes: 8 additions & 0 deletions _includes/image_file_formats/open_czi_imagejgui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
- Open the file mentioned in the activity using:
- [Plugins > Bio-Formats > Bio-Format Importer]
- [X] Display metadata
- [X] Display OME-XML Metadata
- Press [OK]
- Select both "Series"
- Look at the images
- Inspect the metadata
12 changes: 8 additions & 4 deletions _layouts/module.html
Original file line number Diff line number Diff line change
Expand Up @@ -188,22 +188,26 @@
document.getElementById("{{ platform[0] | slugify }}-activity-div").style.display = 'none';{% endfor %}{% unless site.default-platform == "NONE" %}document.getElementById("{{ site.default-platform | slugify }}-activity-div").style.display = 'block';{% endunless %}
}

function change_activity_content_by_platform(form_control) {
function change_activity_content_by_platform(form_control)
{
console.log(`change_activity_content_by_platform called with form_control: ${form_control}`);
updateUrlWithSelection(form_control);
{% for platform in page.activities %}
document.getElementById("{{ platform[0] | slugify }}-activity-div").style.display = 'none';
{% endfor %}
if (! form_control || document.getElementById(form_control).value == "null-activity") {
if (! form_control || document.getElementById(form_control).value == "null-activity")
{
set_activity_view_defaults();
{% for platform in page.activities %}
} else if (document.getElementById(form_control).value == "{{ platform[0] | slugify }}-activity") {
document.getElementById("{{ platform[0] | slugify }}-activity-div").style.display = 'block';
{% endfor %}
} else {
}
else
{
alert("Error: Missing platform value for 'change_activity_content_by_platform()' script!");
}
}
}

function set_exercises_view_defaults () {
{% for platform in page.exercises %}
Expand Down
2 changes: 1 addition & 1 deletion _modules/commenting.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Commenting
layout: module
tags: ["scripting","draft"]
tags: ["scripting", "draft"]
prerequisites:
- "[Binarization](../binarization)"
- "[Connected component labeling](../connected_components)"
Expand Down
1 change: 1 addition & 0 deletions _modules/image_file_formats.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ figure: /figures/image_file_formats.png
figure_legend: Image pixel data and metadata

multiactivities:
- ["image_file_formats/open_czi.md", [["ImageJ GUI", "image_file_formats/open_czi_imagejgui.md"],["python BioIO", "image_file_formats/open_czi_bioio.py"]]]
- ["image_file_formats/open_diverse_file_formats.md", [["ImageJ GUI", "image_file_formats/open_diverse_file_formats_imagejgui.md"],["python BioIO", "image_file_formats/open_diverse_file_formats_bioio.py"]]]
- ["image_file_formats/resaving_images.md", [["ImageJ GUI", "image_file_formats/resaving_images_imagejgui.md", "markdown"]]]

Expand Down
2 changes: 1 addition & 1 deletion _modules/script_for_loop.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Loops
layout: module
tags: ["scripting", "draft"]
tags: ["scripting"]
objectives:
- "Use for loops to repeat operations multiple times"
- "Running a script for multiple files"
Expand Down
2 changes: 1 addition & 1 deletion _modules/script_functions.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Functions
layout: module
tags: ["draft","scripting"]
tags: ["scripting"]
prerequisites:
- "[Variables](../script_variables)"
- "[Loops](../script_for_loops)"
Expand Down
5 changes: 2 additions & 3 deletions _modules/tiff.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,8 @@ assessment: >
{: .solution}
learn_next:
- "[Automatic threshold for binarization](../auto_threshold)"
- "[OME-Zarr](../ome-zarr)"

external_links:
- "[Wikipedia: Binary image](https://en.wikipedia.org/wiki/Binary_image)"
- "[Wikipedia: TIFF](https://en.wikipedia.org/wiki/TIFF)"
---

0 comments on commit 4fa27c8

Please sign in to comment.