Counting nuclei that appear dim - Is it possible?

Hello! My name is Diana, I am using immunohistochemistry images in which the protein of interest appears intense brown and cell nuclei have a purple color but are very dim:
Capture1
Here is a zoom-in to the image in which the purple nuclei can be seen better

I need to normalize the number of protein plaques to the number of cells (identified by the number of nuclei). I can quite well count the protein plaques with IdentifyPrimaryObjects, I did not manage yet to count the nuclei. I have tested various modules:
-IdentifyPrimaryObjects module directly specifying nuclei size ranges - identifies only nuclei that are in the middle of protein plaques:
Capture3
-Unmixcolors - trying to separate the purple color from the rest, did succeed at it
-EnhanceOrSupressFeatures - trying to enhance Dark Holes, since the region occupied by nuclei corresponds to “holes” within the protein-stained mesh, does not identify them correctly
-CorrectIlluminationCalculate - aiming to enhance the intensity of nuclei, did not succeed

Do you have any other ideas that could work?? Would it be possible to seize the fact that regions covered by nuclei correspond to “holes” in the protein mesh?
I would enormously appreciate any opinion!! Thank you so much in advance!

Best wishes,
Diana.

If UnmixColors does succeed at pulling out your purple vs your brown staining, that should be a reasonably straightforward input into IDPrimary- can you post your pipeline and an example raw image to test on?

Hi Beth! Thank you very much for your reply. I attach here an example image and the project including the best result I achieved using UnmixColors + IDPrimary. It does identify the “most clear” regions of the image and achieves a fair approximation to the amount of nuclei, but the specific objects identified do not match the cell nuclei, so I don’t think the project is valid as it is. Perhaps I did not reach the optimal absorbance rates at UnmixColors to correctly separate the purple color?

Your opinion will for sure be very useful! Thanks again!
Diana.

ExampleImage.tif (4.1 MB)
TauQuant_UnmixColors.cpproj (403.8 KB)

Hi @ortegacruzd,

I took a look at your pipeline and I think you’re right - your absorbance rates in UnmixColors were not optimal for detecting purple. As you can see in this screenshot, you’re detecting more brown than purple:

To improve this, I made a small 4 px by 4 px crop of a purple region and then I clicked the “Estimate” button and selected that cropped purple image. The absorbance values changed to ~ 0.3, 0.7, and 0.6 (RGB) and resulted in a very different output (here, I’ve done the same procedure to estimate the brown output so that you can identify plaques as well):

I then used IdentifyPrimaryObjects on the new purple image without the ImageMath inversion. I found that an Otsu two-class threshold does a pretty good job at identifying nuclei (I also dropped the lower bound on the size threshold to 10). Note that the “View Workspace” option is very helpful for comparing the nuclear segmentation to the original image.

I hope this helps and good luck!

Another note, @ortegacruzd – UnmixColors will perform optimally when all stains present in your histology image are included in the unmixing process (even if you won’t use one of the stains for downstream processing). For example, even if you were only interested in counting light purple nuclei, I’d still recommend including the brown color in your UnmixColors module in order to get best results.

Good luck again!

Thank you very much for your help, @pearl-ryder!!! Your suggestions led to a great improvement of my pipeline! I had not come across the idea of cropping to Estimate the absorbance, and was not familiar either with “View Workspace”. This was all very helpful for me :slight_smile:

I have an additional matter, which would also be very incredibly useful to implement this pipeline: I want to analyze images of the same staining but that have differences in intensity between them (not sure if due to differences in staining or in microscope settings). Would there be a way to average the intensity of all images at the beginning of the pipeline, such that then the thresholds for IDPrimary are valid for all images?

Thank you so so much for taking the time. Best wishes,
Diana.

Hi @ortegacruzd,

I’m so glad that my response was helpful, Diana!

Regarding thresholding for images with varying intensities within a dataset: for this exact reason, I would recommend using an automatic thresholding method. These methods automatically select a pixel intensity value to determine background (below the threshold value) and objects-of-interest (above the threshold). They do so based on the histogram of intensity values for an individual image and for this reason, they often can perform well across a variety of staining intensities (although nothing will be perfect).

More details are available within this video: CellProfiler Workshop - YouTube

And here’s a helpful guide for thinking about an image analysis workflow: When To Say ‘Good Enough’ | Carpenter Lab

Good luck!