Mitochondria Structure & Measurement

Jan 23, 2023 | Knowledge

The structure of mitochondria has been linked to disruptances in cellular processes, such as energy metabolism, calcium storage and lipid synthesis. Since mitochondria can be easily stained and imaged, it is also possible to measure their dimensions and detect whether an intervention affects their size or structure.

We developed a simple algorithm to measure the width and length of mitochondria. Originally it followed the following procedure:

Figure 1 – Analysis process for mitochondria measurements.

 

The whole pipeline can be executed in Image 1. It starts by applying 1px rolling ball background subtraction, followed by automated Otsu threshold. Then we measure the width of the mitochondria, represented as Minimal Feret diameter. This is done via Analyze -> Analyze Particles… menu option. Then we skeletonize the binary image (Process – > Binary -> Skeletonize), which converts mitochondria into a 1px wide lines. Then we measure the length, represented as Area, by running Analyze Particles…

The rolling ball algorithm implementation is poor in Python, therefore we can use black_tophat algorithm from scikit-image with a comparable result. Instead of Minimal Feret diameter we use Minor axis length property from regionprops method to measure the width. We also use Isodata thresholding instead of Otsu, which gave better results.

from skimage import io
from skimage.morphology import white_tophat, disk, remove_small_objects, skeletonize
from skimage.filters import threshold_isodata
from skimage.measure import regionprops_table, label
import numpy as np
image=io.imread("neg-image09.tif")
str_el = disk(2) #you can also use 'ball' here to get a slightly smoother result at the cost of increased computing time
image_step1=white_tophat(image, str_el)
Threshold the image with Isodata algorithm.
t=threshold_isodata(image_step1)
image_step2=image_step1 > t
# Remove all objects smaller than 10 pixels.
image_step3=remove_small_objects(image_step2,10)
# Label the binary image and measure the width as minor axis length.
image_lbls=label(image_step3)
widths=regionprops_table(image_lbls,properties=["label","minor_axis_length"])
# Skeletonize the image and measure the length as area.image_sk_1=skeletonize(image_step3)
image_sk_2=image_sk_1*image_lbls # This applies the same labels as in widths, so we can link measurements together. 
lengths=regionprops_table(image_sk_2,properties=["label","area"])
print(f"The mean width of mitochondria is {np.mean(widths['minor_axis_length'])} px")
print(f"The mean length of mitochondria is {np.mean(lengths['area'])}px")
The mean width of mitochondria is 4.404797885309625 px
The mean length of mitochondria is 11.598681499793985 px