The fields of histology and immunohistochemistry have been extremely helpful for clinical diagnosis and staging of numerous diseases such as cancer and fibrosis. Scientists and clinicians have relied on having a wide array of tissue stains to help identify important anatomical features and aspects within the tissue biopsies that enable them to make an accurate diagnosis.1,2 However, an experienced pathologist with a practiced eye must make decisions based on subtle differences in the staining, such as Masson’s Trichrome, which leads to inter- and intra-observer sampling variability.1 Thus, a reliable, sensitive, and easy-to-read staining procedure can reduce errors by removing the human variability associated with subjective scoring. Determining the collagen content in a histology sample is the key for assessing fibrotic disease progression. Collagen hybridizing peptides (CHPs) have proven to be a unique tool for specifically recognizing denatured collagen molecules in a variety of tissues, species, and disease models.3 Here, we describe a fluorescent image quantification protocol for use with Image-J/FIJI that can be used to objectively measure collagen content in a histology slide. This measurement is based on CHP fluorescent intensity within the tissue sample, which has been readily treated to completely denatured its collagen content on purpose. This protocol is designed to work with formalin-fixed paraffin-embedded (FFPE) that have undergone heat-mediated antigen retrieval as well as on frozen tissue sections.

After washing off excess CHP solution, the tissue can be imaged, and imported into ImageJ/FIJI for signal quantification (See below). The signal intensity correlates with the amount of collagen within the sample. As the tissue sections get thicker, they contain more collagen and therefore we expect to see higher signal intensity from CHP binding to denatured collagen strands. In Figure 1, CHP signal is more intense as the tissue gets thicker, confirming that CHP signal correlates to total collagen content. The intensity was determined by measuring the average pixel intensity of the total area imaged after background subtraction. This method will allow researchers to easily visualize and quantify the total collagen content within a tissue section.

Image-J/FIJI Macro Steps

Please follow the steps below to complete the image analysis correctly. The comments describe what each step of the macro code does, they are shown in green. We have also provided the code without comments so that you can copy and paste it directly into ImageJ by going to Plugins-> New-> Macro. NOTE: The user will need to determine an acceptable threshold value to help remove some of the background auto-fluorescence. This macro works best with high signal-to-noise ratio, if there is low signal with lots of background noise or auto-fluorescence, you will need to include additional steps prior to running this macro.

setBatchMode(true); //Tells imageJ that the following code will be run on a batch of files.

output = getDirectory("Output Directory"); //sets the output variable as the user defined directory with title “output Directory”. ImageJ will ask user to specify what folder to output data into. ImageJ will ask for the output directory FIRST.

input = getDirectory("Input Directory"); //sets the input variable as the user defined directory with title “Input Directory”. ImageJ will ask user to specify what folder to search through. It is easier if you place all the images you wish to evaluate in the same folder.

Dialog.create("File Type");

Dialog.addString("File Suffix: ",".tif"); //tells ImageJ to only use files of type “.tif”. Users can specify what file type they wish ImageJ to use (e.g. “.jpeg”).

suffix = Dialog.getString();

processFolder(input); //This is how ImageJ will search through the user specified input folder.

function processFolder(input){

list=getFileList(input); //Sets the variable list to the number of files in the input folder.



processFolder(""+input + list[i]);


processFile(input, output, list[i]); //This loop scans the folders/subfolders/files to locate the files with the correct suffix.



//This is the process that will act on each image file in the folder

function processFile(input, output, file) {

open(file); //Opens file of type “.tif”.

print("Processing: " +input + file); //Prints “Processing: input (file path) and file (filename) to the log.

run("16-bit"); //Converts image to 16-bit. To save time, you may want to run the code from this line onwards as a test to see if any further image processing is needed. It will just perform the steps on a single image that is already open and selected in ImageJ.

run("mpl-viridis"); //Sets the image to LUT mpl-viridis which is useful to view pixel intensity.

run("Measure"); //Measures the pixels in the image

run("Set Measurements...", "area mean standard min integrated limit display redirect=None decimal=3"); //Allows user to define what measurements are taken during the “Measure” Command. Make sure that “area, standard deviation, min & max gray value, integrated density, mean gray value, limit to threshold, and display label” are all checked to be measured. You can double check this by going into Analyze-> Set Measurements.

setAutoThreshold("Mean dark"); //The auto-threshold method is set to mean with the dark background option selected.

setThreshold(11,255); //Set Threshold for threshold based on positive control, this can be changed by clicking Image->Adjust->Threshold and choosing the value that shows all the signal but cuts out any background. ***IMPORTANT-you need to set the threshold to a value that you choose based on the fluorescent intensity of your positive control. To do this simply go to Image-> Adjust->Threshold, select Mean from the threshold-type dropdown menu and select dark background. You can adjust the min and max threshold values and then hit set. Do not hit apply, as this will create a mask and change all pixels with a value above the threshold to 255 (red).

getThreshold(lower, upper); //Finds the upper and lower limit of threshold, this should match the values you set in the step above.

print("Min: "+lower+" - "+"Max: "+upper); //Prints the min and max threshold values to log.

run("Measure"); //Runs measure again.

title = getTitle(); //Sets the variable title to be the title of the file, i.e. it fetches the filename.

saveAs("jpeg", output+title); //Saves the file as a .jpeg, to the user defined output folder with the filename.

print("Saved to: "+output); //Prints “Saved to: the output filepath” to the log.


selectWindow("Results"); //Selects the window titled “Results”, which is where all the measurements data is stored.

saveAs("Results", output+ "Results"+".tsv"); //Saves the data from the “Results” table to your defined output folder as filetype .tsv (easy to copy and paste into excel) with the name Results.

print("Task Complete"); //Prints “Task Complete” to the log to indicate that ImageJ has finished searching the folder, and processing all the images with the defined filetype in the folder.