-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
mesh_closest_points.ijm does not mesh closest points #14
Comments
Hey @pdd2110, you have a valid point here! In fact, the documentation was misleading. I just updated it to make this aspect clear. Let me know what you think: Yes, the distance matrix contains an additional entry which is supposed to represent the background. In ImageJ and in CLIJ we do work a lot with label images, where the intensity (1, 2, 3, ...) represents the identifier of the object 1, 2, 3.... 0 usually represents the background, "no object". Thus, you find the distance of object 1 to 2 in the distance matrix in entry [1][2]. Operations such as spotsToPointlist and labelledSpotsToPointlist help to make the correspoinding pointlists from label images. Anyway, I would like to incorporate your changes in the macro. Do you want to send a pull-request or shall I copy&paste the stuff over? Thanks for the feedback! You made clij better today! Cheers, |
Thanks Robert, happy to help! I really appreciate the explanation of how the distance matrix is set up and the "no object" column/row. And thanks for pointing me to how you can use those functions and the example code. I just started playing with CLIJ yesterday, so I'm really proud I was able to contribute! I'm very new to GitHub (probably second time using it) so it would probably be easier if you copy/paste it over rather than me figuring out how to send a pull-request. (I'll get it eventually, but today is not the day!) An acknowledgement would be cool, but my contribution is really minor comparatively. Thanks again, really great code and super user-friendly! Cheers, |
Alright! Thanks again. If you need further support, I'm also happy to chat on https://image.sc Cheers, |
Thanks, I'll probably take you up on that! |
I was using your mesh_closest_points.ijm as a starting point for a macro and found an error stemming from
Ext.CLIJ2_generateDistanceMatrix(pointlist, pointlist, distance_matrix);
specifically, generateDistanceMatrix() creates a distance matrix of (n+1)*(m+1) pixels, that has all (X, 0) and (0, Y) pixels set to '0' intensity, and the 'desired' distances are shifted by X+1 and Y+1 pixels. For example, if there are 15 points, the distance_matrix is 16x16 pixels, with all pixels at (X, 0) and (0, Y) having intensity value == 0 (i.e. the first row and column, respectively, are black). I'm guessing this is so that the intensity from the label corresponds with the X and/or Y value in the distance_matrix, rather than the index. Either way, this leads to downstream issues, e.g. when generating a Results table from these images, as the corresponding columns are right-shifted and rows are down-shifted due to the blank column1 and row1, thus throwing off the data extraction, adding a point at (0,0), and ignoring the last point (now row/column 16). I'm sure there are other ways to deal with it, but I found that cropping the first row and column of the distance_matrix solved the issue.
Here's the same code with my additions. I left the Ext.CLIJ2_pull(distance_matrix); in there so you can see what I'm referring to, but it's not required. A couple other minor bug fixes and additions too. Either way, thanks for the backbone!
`// CLIJ example macro: mesh_closest_pointsijm
//
// This macro shows how to draw lines between closest points in the GPU.
//
// Author: Robert Haase,
// September 2019
// ---------------------------------------------
// Get test data
run("Blobs (25K)");
//open("C:/structure/data/blobs.gif");
getDimensions(width, height, channels, slices, frames);
input = getTitle();
threshold = 128;
// Init GPU
run("CLIJ2 Macro Extensions", "cl_device=");
Ext.CLIJ2_clear();
// push data to GPU
Ext.CLIJ2_push(input);
// cleanup ImageJ
run("Close All");
// blur
blurred = "blurred";
Ext.CLIJ2_blur2D(input, blurred, 15, 15);
// detect spots
detected_spots = "detected_spots";
Ext.CLIJ2_detectMaximaBox(blurred, detected_spots, 10);
Ext.CLIJ2_pullBinary(detected_spots);
// get spot positions as pointlist
pointlist = "pointlist";
Ext.CLIJ2_spotsToPointList(detected_spots, pointlist);
Ext.CLIJ2_pull(pointlist);
Ext.CLIJ2_getSize(pointlist);
number_of_detected_spots = getResult("Width", nResults() - 1);
IJ.log("number of spots: " + number_of_detected_spots);
// determine distances between points
distance_matrix = "distance_matrix";
Ext.CLIJ2_generateDistanceMatrix(pointlist, pointlist, distance_matrix);
Ext.CLIJ2_pull(distance_matrix);
// crop first row and column of distance_matrix
crop_distance_matrix = "crop_distance_matrix";
Ext.CLIJ2_crop2D(distance_matrix, crop_distance_matrix, 1, 1, number_of_detected_spots, number_of_detected_spots);
Ext.CLIJ2_pull(crop_distance_matrix);
// determine n closest points
n_closest_points = 5;
cropclosestPointsIndices = "cropclosestPointsIndices";
Ext.CLIJ2_nClosestPoints(crop_distance_matrix, cropclosestPointsIndices, n_closest_points);
// empty results table
run("Clear Results");
// we build a table with 2+n rows:
// x and y of the points and n rows with indices to closes points.
// as every points is the closest to itself, row number 3 will always be 0, 1, 3, 4 ...
Ext.CLIJ2_image2DToResultsTable(pointlist);
Ext.CLIJ2_image2DToResultsTable(cropclosestPointsIndices);
crop_mesh = "crop_mesh";
Ext.CLIJ2_create2D(crop_mesh, width, height, 32);
Ext.CLIJ2_set(crop_mesh, 0);
for (p = 0; p < number_of_detected_spots; p++) {
x1 = getResult("X" + p, 0);
y1 = getResult("X" + p, 1);
}mesh = "mesh";
Ext.CLIJ2_create2D(mesh, width, height, 32);
Ext.CLIJ2_set(mesh, 0);
for (p = 0; p < number_of_detected_spots; p++) {
x1 = getResult("X" + p, 0);
y1 = getResult("X" + p, 1);
}
Table.rename("Results", "closestPointsIndices");
// show result
Ext.CLIJ2_pull(mesh);
run("3-3-2 RGB");`
The text was updated successfully, but these errors were encountered: