LabCanvas

Wound healing (scratch) assay analysis in ImageJ: % closure step by step

Measure a scratch wound in ImageJ: variance filter, threshold and Analyze Particles per frame, then % closure and closure rate, with a worked example.

ImageJ wound healing analysis of a synthetic scratch time-lapse: four frames at 0, 6, 14 and 22 hours with the open area outlined in yellow, closing from 118,259 µm² to 30,031 µm² (74.6% closed)
ImageJ wound healing analysis of a synthetic scratch time-lapse: four frames at 0, 6, 14 and 22 hours with the open area outlined in yellow, closing from 118,259 µm² to 30,031 µm² (74.6% closed).
Contents

To analyse a scratch (wound healing) assay in ImageJ, measure the open, cell-free area of the gap in every frame: convert the time-lapse to 32-bit, run Process › Filters › Variance… (radius about one cell) so the textured cells turn bright and the smooth gap stays dark, threshold the gap with Image › Adjust › Threshold…, and run Analyze › Analyze Particles… with Summarize on all frames. Then:

% closure=A0−AtA0×100

and the closure rate is the slope of open area against time (µm² per hour).

On the worked example below, ImageJ measures the gap closing from 118,259 µm² to 30,031 µm² in 22 hours: 74.6% closure at 4,021 µm² per hour (R² 0.9999).

What you need: ImageJ 1.x or Fiji (every command here is in both). A time-lapse of one field of a scratch, or one image per time point of the same field; set the pixel size if the file has none. The example is a synthetic scratch time-lapse (12 frames 2 h apart, 480 × 360 pixels, 1.3 µm per pixel) made for practice, with a known open area in every frame. Time: about 15 minutes.

Why a variance filter finds the gap

A phase-contrast or brightfield image of cells is grainy: cell edges, nuclei and organelles make the grey value jump from pixel to pixel. The scratch has no cells, so it is smooth. The mean brightness of the two can be almost the same, which is why a plain threshold of the image fails.

The variance filter replaces each pixel by the variance of the grey values in a small circle around it. Grainy regions get a high value, smooth regions a low one. A threshold of the variance image then separates cells from gap. This is the idea behind the MRI Wound Healing Tool and the Wound Healing Size Tool (Suarez-Arnedo et al. 2020).

How do I measure the wound area in ImageJ? Step by step

Step 1: Open the time-lapse

Click File › Open… and choose the file. Check the line above the image: it should show the size in microns (here 624.00x468.00 microns), and the slider at the bottom should run through all frames. If the frames came as separate files, use File › Import › Image Sequence… to make one stack. If the scale is missing, set it with Analyze › Set Scale….

ImageJ window with the synthetic scratch time-lapse at frame 1
Step 1 in ImageJ 1.54f: frame 1 of the synthetic scratch. The gap is smooth 1, the cells are grainy 2, and the slider runs through 12 frames 2 h apart 3.

Step 2: Run the variance filter

Make a copy for the analysis (Image › Duplicate…, tick Duplicate stack), then choose Image › Type › 32-bit so the variance does not clip at the top of the 16-bit range. Now choose Process › Filters › Variance…, type a Radius of about one cell (8 pixels here, about 10 µm), click OK, and answer Yes to process all 12 images.

ImageJ Variance dialog with Radius 8 typed in
Step 2: Process › Filters › Variance… on the 32-bit copy. Radius 8 pixels 1, then OK and Yes for all 12 frames 2.

Step 3: Look at the variance image

The cells are now bright and the gap black. Step through the frames: the black band narrows as the two fronts move in.

ImageJ variance images of frame 1 and frame 12 side by side
Step 3: the variance image at frame 1 1 and frame 12 2. The gap is the dark band; it is much narrower at 22 h.

Step 4: Threshold the gap

Go back to frame 1 (the widest gap) and choose Image › Adjust › Threshold…. Pick Otsu, and untick Dark background: the gap is the dark part you want selected. The gap turns red, with a few small red specks between cells. Do not click Apply; leave the window open so the threshold stays set for every frame.

ImageJ Threshold window with Otsu on the variance image, the gap shown in red
Step 4: Image › Adjust › Threshold… on frame 1 of the variance stack: Otsu 1, Dark background unticked 2, upper limit 40331 3. The gap is red 4; the small red specks between cells are removed by the size limit in the next step.

Keep the same threshold for all frames. If you let ImageJ pick a new one per frame, a narrower gap gets a different cut, and the areas are no longer comparable.

Step 5: Analyze Particles on all frames

Choose Analyze › Analyze Particles…. Type a minimum Size that is larger than the specks and smaller than the gap (1000-Infinity µm² here), tick Display results, Include holes (debris inside the gap counts as open) and Summarize, and click OK. Answer Yes to process all 12 images.

ImageJ Analyze Particles dialog with size 1000-Infinity, Display results, Include holes and Summarize ticked
Step 5: Analyze › Analyze Particles… with a size of 1000-Infinity µm² 1, Display results 2, Include holes 3 and Summarize 4.

Step 6: Read the open area per frame

The Summary table has one row per frame. Total Area is the open area in µm²; %Area is the share of the field. Copy the table into a spreadsheet, or keep going in ImageJ.

ImageJ Summary table with the open area of all 12 frames
Step 6: the Summary table. Open area 118,259 µm² at 0 h 1 and 30,031 µm² at 22 h 2, one particle the gap per frame.

Step 7: Fit the closure rate

Choose Analyze › Tools › Curve Fitting…. Delete the example numbers, paste two columns (time in hours, open area), choose Straight Line and click Fit.

ImageJ Curve Fitting window with time and open area pasted and Straight Line chosen
Step 7: Analyze › Tools › Curve Fitting… with the 12 time points pasted 1, Straight Line chosen 2, then Fit 3.

Step 8: Read the slope

The plot shows the points and the line, with the fitted a (intercept) and b (slope). The slope is the closure rate: here b=−4020.6 μm2 per hour, with R2=0.9999.

ImageJ Curve Fitting result: a straight line through the open area against time
Step 8: the fit y = a + bx. The slope b = −4020.59 µm²/h is the closure rate 1; R² = 0.9999 2.

The worked example: % closure and closure rate

Open area from the Summary table, with % closure=(A0−At)/A0×100 and the mean width = area ÷ the length of the wound in the field (468 µm, the field height):

FrameTime (h)Open area (µm²)% of initial% closureMean width (µm)
10118,259100.00.0252.7
22110,44193.46.6236.0
34102,50786.713.3219.0
4694,52879.920.1202.0
5886,76173.426.6185.4
61078,70266.533.5168.2
71270,60659.740.3150.9
81462,52352.947.1133.6
91654,51146.153.9116.5
101845,80938.761.397.9
112038,05432.267.881.3
122230,03125.474.664.2

% closure at 22 h =118,259−30,031118,259×100=74.6%.

Closure rate (slope of area against time) = 4,021 µm²/h, R² 0.9999. Divided by the wound length (468 µm), the gap narrows by 8.59 µm/h, so each front moves at about 4.3 µm/h.

Four frames of the scratch with the measured open area outlined in yellow
The open area found by ImageJ variance radius 8, Otsu threshold of frame 1, Analyze Particles from 1000 µm² at 0, 6, 14 and 22 h, outlined in yellow.

Because the sample is synthetic, the true answer is known: the gap closes from 116,728 to 29,132 µm², 75.0% closure at 3,982 µm²/h. ImageJ's 74.6% and 4,021 µm²/h are within 1% of it. The variance window reaches across the cell front, so the outline sits a few pixels off the true edge; it is the same offset in every frame, which is why % closure and the rate come out right.

Or outline the gap by hand (polygon tool)

For a few images, or when the texture method fails (dense debris, very flat cells), outline the gap yourself. Pick the Polygon selections tool, click along one edge from top to bottom and back up the other edge, double-click to close, and press Ctrl M (Analyze › Measure). Set Area in Analyze › Set Measurements… first.

ImageJ polygon drawn along both edges of the scratch at frame 12, with the Results table
A polygon with ten points down each edge one every 52 µm at 0 h and 22 h: 119,449 and 29,609 µm², so 75.2% closure. Zoom in to place the points on the cell front, not on the halo.

The polygon gives 75.2% closure here. It is quick for a handful of images, but it depends on the person clicking; if you do it by hand, blind yourself to the condition and outline every frame the same way.

The Wound Healing Size Tool plugin

The Wound Healing Size Tool (Suarez-Arnedo et al. 2020) packages the same variance-and-threshold idea for ImageJ and Fiji. Download it from its GitHub page, install it with Plugins › Macros › Install…, set the scale, and run it on an image or a stack. It reports the wound area, the area fraction, the mean wound width and the width's standard deviation, and it corrects the width for a tilted scratch. Its main settings are the variance window radius and the threshold value; check the outline on every image before you trust the numbers. The older MRI Wound Healing Tool macro works in a similar way.

Pitfalls

  • Different fields at different times. Closure only means something for the same field. Mark the plate, use the stage memory, or align the frames before measuring.
  • A new threshold for every frame. Keep the threshold from the first frame. An automatic threshold on each frame changes with the gap width.
  • Window radius. Too small and the gap gets grainy holes from noise; too large and the outline moves away from the front. About one cell diameter works.
  • Cells in the gap. Single cells that wander into the gap make holes in the open area. Include holes counts them as open, which is usually what the assay means (the front has not arrived).
  • Proliferation. Over 24 h cells also divide, so closure is migration plus growth. Use mitomycin C or low serum if you want migration alone, and say which.
  • % closure from different starting widths. A 400 µm scratch and a 600 µm scratch at the same speed give different % closure. Report the rate as well, or start from matched widths.

Reporting it

Scratch wounds were imaged every [2] h for [22] h ([10×], [1.3] µm per pixel). The open area was measured in ImageJ 1.54f: 32-bit, variance filter (radius [8] pixels), Otsu threshold of the first frame applied to all frames, Analyze Particles (minimum [1000] µm², holes included). % closure = (A₀ − Aₜ)/A₀ × 100; the closure rate is the slope of a linear fit of open area against time. Values are mean ± SD of [n] wells from [3] independent experiments.

Cite ImageJ (Schneider et al. 2012), and the Wound Healing Size Tool (Suarez-Arnedo et al. 2020) if you used it. Jonkman et al. (2014) give good general guidance on running and imaging the assay. Plot % closure against time per condition, with the rate per well as points.

Switch to LabCanvas: wound closure in a few clicks

LabCanvas Image Analysis has a guided wound healing assay in the browser: no plugin, no macro, nothing to install.

  1. Open the time-lapse (or click Try it on a sample for the same synthetic scratch) and go to Assays › Wound healing (scratch).
  2. Texture: a Window radius about one cell and a Threshold method; keep Same threshold for every frame and Correct the edges for the window ticked.
  3. Open area: Keep the region Reaching the edge, a smallest size, and Fill specks inside the wound.
  4. Click Measure all frames: open area, % of initial, % closure and mean width per frame, and the closure rates with R². Send the table to Graphs.
Wound healing scratch in LabCanvas Image Analysis
Wound healing scratch: Scratch 75.2% closed by the last frame, closing at 4,000 µm²/h R² 1.000.

On the same synthetic scratch LabCanvas gives 75.2% closed by the last frame, closing at 4,000 µm²/h (R² 1.000), and 8.52 µm/h narrower; ImageJ above gave 74.6%, 4,021 µm²/h and 8.59 µm/h, against a true 75.0% and 3,982 µm²/h.

Why switch for scratch assays:

  • A guided assay instead of a plugin: the variance method, one threshold for all frames and the edge correction are built in, with the outline drawn on every frame.
  • Rates with R² straight away, and the table goes to Graphs for statistics across wells and a figure.
  • Nothing to install: runs in the browser on any computer, next to the incubator microscope.

Fiji stays better for batch runs over hundreds of plates with a macro, and for files that need Bio-Formats (.czi, .nd2, .lif), which LabCanvas needs as OME-TIFF first.

Open Image Analysis: free with a LabCanvas account (downloading files is part of LabCanvas Pro). ImageJ and Fiji are independent open-source projects; LabCanvas is not affiliated with them.

References

  • Jonkman JEN, Cathcart JA, Xu F, Bartolini ME, Amon JE, Stevens KM, Colarusso P (2014). An introduction to the wound healing assay using live-cell microscopy. Cell Adhesion & Migration 8, 440–451. doi:10.4161/cam.36224
  • Schneider CA, Rasband WS, Eliceiri KW (2012). NIH Image to ImageJ: 25 years of image analysis. Nature Methods 9, 671–675. doi:10.1038/nmeth.2089
  • Suarez-Arnedo A, Torres Figueroa F, Clavijo C, Arbeláez P, Cruz JC, Muñoz-Camargo C (2020). An ImageJ plugin for the high throughput image analysis of in vitro scratch wound healing assays. PLOS ONE 15, e0232565. doi:10.1371/journal.pone.0232565

Frequently asked questions

How do I calculate % wound closure?

% closure=(A0−At)/A0×100, where A0 is the open (cell-free) area at time 0 and At the open area at time t, measured on the same field. On the example here the gap shrinks from 118,259 to 30,031 µm² in 22 h, so closure is (118,259−30,031)/118,259×100=74.6%.

How do I measure a scratch assay in ImageJ?

Convert the time-lapse to 32-bit, run Process › Filters › Variance… (radius about one cell) on all frames, threshold the low-variance gap with Image › Adjust › Threshold (Otsu, Dark background unticked), and run Analyze › Analyze Particles with a minimum size, Include holes and Summarize. The Summary table gives the open area of every frame. For a few images, outlining the gap with the polygon tool and pressing Ctrl M works too.

What is the Wound Healing Size Tool?

An ImageJ/Fiji plugin by Suarez-Arnedo et al. (PLOS ONE, 2020) that measures the wound area, the area fraction, the mean wound width and its standard deviation, from single images or stacks. It is installed with Plugins › Macros › Install… and uses the same idea as this guide: a variance filter separates the textured cells from the smooth gap.

How do I calculate the wound closure rate?

Plot the open area against time and fit a straight line (Analyze › Tools › Curve Fitting…, Straight Line). The slope is the closure rate in µm² per hour. Divide it by the length of the wound in the field to get the rate at which the gap narrows (µm per hour), and by 2 for the speed of each front.

Should I report % closure or the rate?

Both, if you can. % closure at a fixed time is easy to compare but depends on the starting width; the rate from a fit over several time points uses all the data and does not depend on one frame. Always say how the area was measured and at which times.

Is there a way to do this without installing ImageJ?

LabCanvas Image Analysis has a guided Wound healing (scratch) assay in the browser: it finds the gap from the texture on every frame and gives % closure and the closure rate with R². It is free with a LabCanvas account.

wound healing assay imagejscratch assay analysiswound closure percentage calculationwound healing size tool imagejscratch assaymigration assayvariance filterclosure ratetime-lapseImageJ

Try it in LabCanvas

Every app is free to start in your browser. Create an account and begin.

Start Image Analysis free in your browser