After integrated meetings with specialists we saw a huge need to make our tests suitable for quantitative determination of analyte concentration. Thus, to solve this problem we have decided to build a strong foundation by developing a universal protocol and a Python script that would detect strips and measure the signal intensity on the test line. Such an approach would facilitate the development of quantitative LFA strip tests in the future.


One of the most important things is to make such measurements repeatable by any iGEM teams in the future. Thus, we have set some rules that teams have to follow in order to obtain standardized results of the intensity on the test line. Such measurement could be performed by any digital camera by taking a picture at desired time points. The strips should be placed on black or similar color paper. The script successfully completed testing both with pictures taken with a good camera (Canon EOS 80D) and with a regular phone camera (Xiaomi Mi Mix 3).


Finally, we have written a detailed protocol and explained the Python script for such measurement. The Python script has multiple comments that will guide the user through the code and explain the most important parameters that have to be set manually. Here we briefly present the whole protocol and explain key points in the code that one has to follow to obtain the best results.

  1. Run LFA assay by applying analyte on the sample pad
  2. After 20 minutes place the LFA strips on the black paper on any other contrasting color. Align strips as it will reduce additional editing in the script.
  3. Take a picture of strips. We recommend no more than 12 strips per picture.
  4. Transfer picture to the computer and open our provided Python script.

Steps inside the Python script: (required user changes are marked with comment blocks in the script)

  1. Specify the file name into the cv2.imread() function
  2. Set the appropriate threshold value to obtain contours of strip tests (default value is 120)
  3. Select and rotate images if needed with appropriate rotation function cv2.ROTATE_90_COUNTERCLOCKWISE, cv2.ROTATE_180, cv2.ROTATE_90_CLOCKWISE
  4. Important! Specify the profile line location that will measure the test line intensity. Use previously obtained images as a guide.
  5. Select sensitivity of peak determination by changing prominence value (default value 0.2)

The script can be copied straight from our wiki page or can be downloaded as a jupyter notebook file.

Example of image processing:

Figure 1. Initial photo taken with a camera. Analyte concentrations are: 40 µM, 20 µM, 10 µM, 5 µM and 0 µM.

Figure 2. Red numbers – arbitrary stirps labels.

Parameters: threshold = 0.

Figure 3. Strips with a profile line that measures the intensity of the test line.

Parameters: warp[3] = cv2.rotate(warp[3], cv2.ROTATE_90_CLOCKWISE), start=(150,25), end=(250,25).

Figure 4. Final analysis picture with peak intensities. Blue color - intensity read from profile line. Yellow color – smoothed signal. Red triangles – detected peaks.

Parameters: prominence = 0.5.

Future Implementations

The protocol is very simple, so anyone could follow it in any lab or home conditions. It could allow other further projects without any effort quantitatively measure the test line intensity, thus calibrate their LFA design, or even such approach latter could be integrated into a software tool that would measure the intensity on the go, for example with a smartphone’s camera shot.

Because LFA is a very popular method with its speed and simplicity, this measurement procedure can be applied to many types of LFA tests. The same principles can be used and script code can be modified to be used in other similar types of projects where quantitative determination is required.

Calibration and normalization

We used a calibration procedure to validate the whole measurement process. Calibration procedure consists of 5 assays (Fig. 1) where analyte concentration is serially diluted. The picture is then analyzed via the script and intensities could be correlated to the appropriate concentration (Fig. 5).

In the script another precaution is made: first of all the baseline of the signal is measured from every strip and subtracted from the initial signal. Basically, every strip baseline serves as a control for that test, meaning, that different lighting conditions should not affect the final result. After that, the signal is smoothened via Savitzky-Golay filter to eliminate the noise. Now the peaks can be determined from the smoothened signal. However, it is important to note that the peak values are obtained from the unfiltered data as smoothing always drastically reduces the signal amplitude.

Every user of our measurement protocol should perform the same or similar calibration experiment in order to calibrate their own LFA strip test.