- Bandpass the signal to get a sinewave out of it.
- Measure the amplitude of the sinewave. There are plenty of ways to do it. Choose an approach that uses all points of the sinewave and not the peaks only. That will let you exploit the resolution available from the signal.
In Mathematica, the filtering and amplitude measurement can be done as follows:

A computationally simpler (and also lower resolution!) approach is to take the difference of the quantiles of the signal that are close to the boundary, in this case 1/60th and 59/60th quantile:

Better statistical estimates of the "top" and "bottom" can be had by fitting a mixture of two skew-normal distributions. For guidance, see this answer. See also this answer where an iterative approach easy to implement from scratch in C is demonstrated. As a starting point, one can take a mixture of two normal distributions, but that's not the best model for the data as there will be some interaction between the shape of the transition areas and the mean. The skew-normal distribution will model that better.
Note that a lot of Mathematica is implemented in Wolfram Language (vs. C++ and C), and there's this helpful function called GeneralUtilities`PrintDefinitions that lets you inspect the normalized source code of a built-in function of interest.
So, if you wanted to understand how distribution fitting works, the following code would be a starting point:
Needs["GeneralUtilities`"] GeneralUtilities`PrintDefinitions[SmoothKernelDistribution] GeneralUtilities`PrintDefinitions[Statistics`SmoothKernelDistributionDump`iValidOptionsQ]
Signal recovery takes each row of the inverted image, converts it to a series of {x,brightness} pairs, builds a polygon on these coordinates, then takes the first (x) coordinate of the polygon's centroid. This takes advantage of the antialiasing of the original plot, and recovers a higher resolution signal than would be obtained by binarizing the image first.
