Identifying transfected cells from stained nuclei



I’m doing an experiment in which I transfect a plate of cells with a plasmid encoding a fluorescent protein (GFP), and I need to analyze its localization. I’ve found that identifying cell objects is much robust using a strategy of identifying nuclei as primary objects and then finding the cells as secondary objects, compared to trying to find the cells as primary objects directly. However, the cell type that I’m using is very finicky about expression level, and I’ve found that co-expressing a nuclear-localized fluorescent protein as a marker can severely drive down expression level of my GFP-tagged protein.

To get around this, I’m staining my cells with a chemical stain against nuclei acid. The issue that then comes up is that my transfection efficiency for this cell type is very low, and for any given field of view I have ~20 nuclei in the blue fluorescence image (IMG_Blue) but only 1-2 transfected cells visible in the green image (IMG_Green). When I try to find secondary objects using IMG_Green (thresholded) as the input, it adds all of the pixels occupied by nuclei in IMG_Blue as objects even though their value is zero in IMG_Green. In addition to being wrong (for my purposes), this confounds the subsequent IdentifySecondaryObjects step because nuclei from untransfected cells that are nearby to transfected cells interfere and infiltrate into the SecondaryObjects derived from nuclei within transfected cells. To solve this, I added an object filtering step where I first MeasureObjectIntensity of the nuclei with IMG_Green as the input image, and then FilterObjects to keep nuclei with a minimum IMG_Green MeanIntensity of 0.01 (chosen arbitrarily). This works beautifully - I end up keeping only the nuclei that are within transfected cells, and then Watershed-Image identification of secondary objects from IMG_Green does a great job of finding the surrounding cell boundaries.

Looking ahead though, I realized I’m going to run into a problem. Some of the proteins that I’m tagging with GFP are very large and therefore impermeable to the nuclear membrane. As such, when I look at previously captured images of these proteins, they are excluded from the nucleus. That means that my thresholding strategy won’t work - when I threshold nuclei based on IMG_Green intensity the transfected cells will be ~0 even though the surrounding cytoplasm will be very bright. I am therefore wondering if there is some strategy I can use to get CellProfiler to keep nuclei objects only if they’re surrounded by high pixel intensity in IMG_Green, even if the nuclei themselves have low or zero pixel intensity in IMG_Green. The only strategy I can think of would be to expand the nuclei by a few pixels, which would send them into the cytoplasm. However, the cells are pretty tightly packed and there are non-transfected cells very close to the transfected cells, which would result in those expanded nuclei also overlapping with transfected cells and being picked up as false positives. Is there a better strategy to do this operation?

Thanks for any advice!


There are a couple of different things you could try- which one (or which combination) will do the best job of cleaning up your experiment is something you’ll have to determine based on your images and pipeline-

  • If your GFP is throughout the cytoplasm (not just concentrated at the membrane), you could do your filtering step based on the IMG_Green MeanIntensity_Edge; to be safe you could also just expand the nuclei a very small number of pixels (1-2).

  • If you’re worried about getting cells that are near transfected cells (but not themselves transfected), you could maybe simultaneously filter for IMG_Green StdIntensity_Edge to throw out nuclei where only one side of the nucleus is bright green

  • You can try to limit the “infiltration” from the untransfected cells by using Propagate rather than Watershed and then messing with the Regularization factor in IDSecondary- setting it to 0 should make IDSecondary respect the intensity gradients of your cells more faithfully. Particularly with cytoplasmic GFP this should work well.

  • You can also filter primary objects based on some property of the secondary object (like its intensity) in FilterObjects->Filter additional objects, but I think that’s less helpful in this use case since you’re saying the secondary objects are not being identified well. I could envision a workflow though where if all of the above fails you do IDPrimary (Nuclei) -> IDSecondary (call it something like FirstPassCells, the segmentation just has to be “good enough” but not perfect) -> MeasureObjectIntensity -> FilterObjects (to filter the secondary object based on the intensity, and filter the nuclei as an additional object (call them something like TransfectionPositiveNuclei)) -> IDSecondary with TransfectionPositiveNuclei as the seeds to get your final Cell objects.

Good luck!


Thank you very much; this was extremely helpful! I’d like to implement filtering based on standard deviation as you suggested, but one obstacle would be that each cell has a different fluorescence intensity, and some are drastically brighter than others. Is there a way to filter based on relative StDev (StDev / mean) rather than raw StDev to account for this?

Edit: On a similar note, when filtering by mean, is there a way to adjust it to filter by mean / (max pixel intensity)? That way I could reuse the same protocol for different batches of images where again some cells are brighter than others. Thanks again!


Both of these could be done by putting one or more CalculateMath modules after your MeasureObjectIntensity module; you can use that to create a derived measurement (stdev/mean, man/max, etc) that you could use in your FilterObjects step.


Perfect. Somehow I skimmed over the existence of that module; that was exactly what I needed. Thank you so much again for all of your help.