GPU accelerated image processing for everyone
Author: Robert Haase, May 2021
This macro shows how to apply an get a voronoi image of a binary image in the GPU.
Clean up first and get test data: An image showing simulated tissue and another image with measurements for every cell where one cell has an increased value.
run("Close All");
open("C:/structure/code/clij2-docs/src/main/resources/tissue.tif");
label_image = getTitle();
open("C:/structure/code/clij2-docs/src/main/resources/measurements.tif");
measurements_image = getTitle();
configure_visualization();
Init GPU and data
run("CLIJ2 Macro Extensions", "cl_device=");
Ext.CLIJ2_clear();
// push data to GPU
Ext.CLIJ2_push(label_image);
Ext.CLIJ2_push(measurements_image);
As cells in tissues communicate with each other via membranes, we can measure regional properties of cells across their boundaries. For example local maximum of the given measurement.
radius = 1; ignore_background = true; Ext.CLIJ2_maximumOfTouchingNeighborsMap(measurements_image, label_image, local_maximum_map, radius, ignore_background); show(local_maximum_map);
You can use differen types for neighborhoods: touching neighbors, n-nearest neighbors and proximal neighbors.
When producing maps of measurements of touching neighbors, the radius parameter can be used to define
for (radius = 0; radius < 4; radius += 1) {
Ext.CLIJ2_maximumOfTouchingNeighborsMap(measurements_image, label_image, local_maximum_map, radius, ignore_background);
show(local_maximum_map);
}
Similarily, n-nearest neighbors can be used to describe a neighborhood:
for (n = 10; n <= 30; n += 10) {
Ext.CLIJ2_maximumOfNNearestNeighborsMap(measurements_image, label_image, local_maximum_map, n);
show(local_maximum_map);
}
Note, when determining the local maximum, the neighborhood of the target pixel of the signal is relevant, not the source. Thus, unintuitive results can appear. Furthermore, per definition n=0 delivers the original parametric image:
for (n = 0; n < 3; n += 1) {
Ext.CLIJ2_maximumOfNNearestNeighborsMap(measurements_image, label_image, local_maximum_map, n);
show(local_maximum_map);
}
You can also select neighbors according to the distance between their centroids. Also here, a distamce d=0 leads to the original parametric image as ouput.
for (d = 0; d <= 50; d += 10) {
min_distance = 0;
max_distance = d;
Ext.CLIJ2_maximumOfProximalNeighborsMap(measurements_image, label_image, local_maximum_map, min_distance, max_distance);
show(local_maximum_map);
}
Clean up by the end.
Ext.CLIJ2_clear();
These are just convenience functions used further up.
function configure_visualization() {
run("Green Fire Blue");
setMinAndMax(0, 100);
run("Calibration Bar...", "location=[Upper Right] fill=White label=Black number=3 decimal=1 font=12 zoom=0.8 overlay");
}
function show(image) {
Ext.CLIJ2_pull(image);
configure_visualization();
}