Measure percentage of positive cells and MFI in positive cells

Hi all,

We are trying to set up CellProfiler for our high-throughput experiments. We take two separate fluorescent images per well, one for Hoechst (stained nuclei) and one for FITC (Annexin). In the end, we want to have the percentage of FITC-positive cells and the mean fluorescence intensity per well. I have built the pipeline to first identify the nuclei with the IdentifyPrimaryObjects module, and expand the nuclei to roughly match the cell body (ExpandOrShrinkObjects). I check if the FITC signal is within the expanded nucleus by overlaying the outlines onto the FITC image. Then, I measure the intensity of the expanded nuclei objects. I display the intensity measurement on the FITC image and based on that, choose a threshold for positive cells manually and use it in the ClassifyObject module.

The problem I have with my pipeline is that I choose the threshold for pos./neg. myself, creating bias. Additionally, the background of our images is different from well to well, so the threshold I choose for the first well may not fit the images for the second well. I have tried to use the IdentifySecondaryObjects module on the FITC pictures and then use the RelateObjects module, but this does not work out well, as the FITC objects are harder to identify.
Also, we would like to measure the mean fluorescence intensity in only the FITC positive cells, but I am not sure how to incorporate that into the pipeline. How can I improve my pipeline?

Thank you!

pipeline_%pos & MFI.cpproj (139.3 KB)

Hi @elead,

I think that expanding nuclei for obtaining “cells” is meaningful in this case. The only thing that you can use IDSecondaryObjects using Distance - N method. The outcome would be exactly the same as for expending, but in IDSecObj you can also choose either keep or discard cells touching image border from the further analysis.

For the automatic threshold, you can make a binary image from your FITC image using Threshold module. There are several methods available, but make sure to test the thresholding parameters on the most extreme images (e.g. image with highest and lowest density, highest and lowest background, etc.).
After applying Threshold module you can either use the binary outcome image for measuring signal intensity in the cell cytoplasm (or whole cells, whichever has more sense for you). This would work if you really don’t care about the distribution of signal intensity, and only pos./neg. classification needed. In ideal case, integrated intensity for all neg. will be 0, and for pos. >= 1.
If you want to have more quantitative data on signal distribution, then you need to multiply you original FITC and Threshold images (Use ImageMath module for that). All the background would turns to 0. In this case, integrated intensity for all neg. will be 0, and for pos. > 0.

The main problem in such approach is that the real life is never ideal case. In my EdU incorporation assay, I need no categorize nuclei as EdU pos. and neg. I do apply threshold before quantification, but still need to apply additional threshold on the further data analysis step. This is because even you apply threshold, there might be a random noise pixel with intensity of 1% above threshold level, and this single pixel would make whole cell positive. To avoid such thing, in my analysis I make a density plot of (EdU Integrated intensity)^0.1 for all wells and pick the threshold base on density plot (actually among number of experiments I keep it 0.5). Don’t ask why I use 0.1 power)). It’s random number that’s allows to make plot looks nicer and easier to set a threshold. It can be any root (square, cubic, etc, but log is not an option if you apply threshold).

Hope it helps

Hi Oleg,

Thank you for your great help!

I had already tried the Distance-N method, but chose to use the ExpandOrShrinkObjects module. I think this will be fine for our purposes if, as you write, the outcome is basically the same.

I have now included the Threshold module in the pipeline and moved the MeasureObjectIntensity to the end of the pipeline, but I cannot use my Threshold image in the ClassifyObjects module. Should I use the FilterObjects module instead?


Did you add your Threshold image in MeasureObjectIntensity? In ClassifyObject you can use only images already used in MeasureObjectIntensity.

If it doesn’t work, please upload your current version of pipeline, I’ll take a look.

Hi, One way you can take out some of the bias of your threshold method is to filter your objects by the “UpperQuartileIntensity”. That way if the overall intensity changes between images then you are filtering for the objects with the greatest intensity regardless of overall intensity. Here is an example of using that module. I have a lower bound to the measurement which I use to raise or lower how much of that upper quartile population I want. Like a threshold you need to find a good value for your entire data set (or a least for the extremes of your data set as recommended in a previous post). Unlike the threshold as it sounds like you have been doing this method will use a statistic to compensate for some variation in the image intensity.


I got it to work now, thank you! I just have two MeasureObjectIntensity modules in my pipeline now, one for the Threshold module and one to measure the intensity of the raw FITC image.

1 Like

Hi @johnmc,

Thank you for sharing your approach! I will definitely try to incorporate in into my pipeline and see what the outcome is.