Aortic ring assay analysis

Hi all,

I would like to analyze angiogenesis images and evaluate the number and the lenght of the sprouts. Is there someone who has a protocol or can help me with that?

Thank you

Hi @Laura

Welcome to the forum!

If you could post an example image and describe what you would like to segment/measure it would be easier to help you.

Cheers

Hi @tibuch,

Thank you for your reply and for your advice!
Here is an example image:

I would like to measure the number and the lenght of the sprouts that grown from the aortic ring. Is that possible using imageJ?

Thank you,

Laura

Without testing but this sounds/looks similar to this problem here.

2 Likes

Dear @tibuch,

Thank you for your help. I tried to follow the protocol they suggested but it’s quite challenging with my pictures! Anyway, thank you again.

Laura

I suggest having a look at these plugins:

The basic workflow would be:

  • Use TWS to segment the sprouts
  • Create a mask
  • Cleanup as needed
  • Skeletonize
  • Analyze Skeleton to measure the lengths

See also the Segmentation page.

1 Like

Hi @ctrueden,

thank you for your suggestion. The problem is that I didn’t manage to cleanup the image and I still have a lot of background (like single cells) and because of that, the skeletonize plugin didn’t work out.

Regards

One way to eliminate isolated background cells is by using the Analyze Particles command on your mask, restricting the size of particles to some minimum number of pixels.

I played a bit with your data, trying to get a good segmentation, but did not really succeed. Just in case it is interesting to anyone, though, here are my results:


Aaand, I accidentally quit Fiji before taking screenshots of the other windows. Today is not my day, sorry.

Overall, I think your images are very challenging. Even to my (untrained) human eye, I am not sure what constitutes a “sprout” vs. background.

1 Like

Hi @ctrueden,

I think that the segmentation you got is better than the one I got! Can you please share the steps you followed to get it?

Thank you so much,

Laura

OK, I redid my attempt just now; here are the steps.

  1. Use Trainable Weka Segmentation for the initial segmentation. In Settings, I turned on Variance and Structure, and increased the maximum sigma to 32. (I learned those tricks from @imagejan, but do not know whether those particular features are optimal here.)

  2. As you pointed out, there are still lots of little spots. So let’s clean those up. First, click “Get probability” to generate the probability map. This is more flexible for further segmentation than just the binary classes.

  3. Auto-threshold on the first channel (class 1 probability) by pressing Shift+T. I used the Shanbhag method since it chose a lower threshold which isolated the sprouts better. Then click Create Mask to turn the thresholded part into a binary image.

  4. Next, clean up the mask: run Analyze Particles, changing the size range to 1000-Infinity. Check “clear results” and “add to manager” options.

  5. The ROI manager pops up. Click More and then “OR (Combine)” to create a selection of all the ROIs. Then run Create Mask again to make another mask of just those “big particles”—i.e., our structure/sprouts of interest here.

  6. Next, run Median filter (as described in that other thread you linked) with radius 4 to clean up the edges a bit. At this point, my mask looks like this:

  7. At this point, I tried to skeletonize, but the resulting skeleton weaves through the trunk in the middle, which I think you don’t want? So to get around that, I drew a large oval in the center and then ran Invert to clear it. After that, the Skeletonize command produces this:

  8. Now we want to analyze the skeleton. But the Analyze Skeleton command requires the original image to be 8-bit rather than RGB color. So jump back to the original image and run the 8-bit command to convert it.

  9. Jump back to the skeleton, and run Analyze Particles. Select the original (now 8-bit) image as the original image. And we have data! I’m not sure it’s very good data, but… at least this process is mostly automatic.


It is interesting to compare the above two images with the ones I posted yesterday. Since I redid the TWS portion by hand again, there are differences. But actually it’s heartening that the skeletons are not too horribly different in the end.

Here is a macro which reproduces steps 3-9. It prompts for two files: the original image, and the saved probability map from TWS.

//selectWindow("image1.jpg");
//run("Trainable Weka Segmentation");
//call("trainableSegmentation.Weka_Segmentation.saveClassifier", "/Users/curtis/Desktop/to-sort/aortic-rings.model");
//call("trainableSegmentation.Weka_Segmentation.saveData", "/Users/curtis/Desktop/aortic-rings.arff");

//call("trainableSegmentation.Weka_Segmentation.getProbability");
//selectWindow("Probability maps");
//saveAs("Tiff", "/Users/curtis/Desktop/to-sort/aortic-rings-probabilities.tif");

orig = File.openDialog("Choose original image");
open(orig);
origID = getImageID();
origTitle = getTitle();

// convert to 8-bit (needed later for Analyze Skeleton command)
run("8-bit");

prob = File.openDialog("Choose probability map");
open(prob);
probID = getImageID();

// apply a threshold to the probability map
setAutoThreshold("Shanbhag dark");
run("Create Mask");
dirtyMaskID = getImageID();

// filter out the little non-sprout particles
selectImage(dirtyMaskID);
run("Analyze Particles...", "size=1000-Infinity clear add");
roiManager("Deselect");
roiManager("Combine");
run("Create Mask");
cleanMaskID = getImageID();

// smooth out the sprout edges
selectImage(cleanMaskID);
run("Median...", "radius=4");

// remove the center of the trunk (manual hack, sorry)
setOption("BlackBackground", true);
makeOval(800, 518, 502, 494);
run("Invert");
run("Select None");

// make the skeleton!
run("Skeletonize");

// finally, analyze the skeleton
run("Analyze Skeleton (2D/3D)", "prune=[lowest intensity voxel] calculate show display original_image=" + origTitle);

Finally, here is a ZIP file with the following files:

  • aortic-rings.ijm - the above macro
  • aortic-rings-probabilities.tif - saved probability map from my TWS attempt
  • aortic-rings.model - saved classifier from my TWS attempt, reusable with additional images
  • aortic-rings.arff - saved data from my TWS attempt (I don’t even know what this is for; read the wiki page after the wiki comes back online)

aortic-rings.zip (22.2 MB)

1 Like