качество картинки отвратительное конечно, но если пройтись градиентным фильтром и размазать
gr = ImageAdjust[GaussianFilter[GradientFilter[GaussianFilter[ColorConvert[img, "Grayscale"], 2], 2], 4]]
что-то разглядеть можно
вытащить данные и натянуть 2х мерный фит экспоненты, погнутой вдоль полинома
grd = ImageData[gr];
data = Flatten[Table[{x, y, grd[[y, x]]}, {y, Length[grd]}, {x, Length[grd[[1]]]}], 1];
expr = a*Exp[-(y - (y0 + y1*x + y2*x^2 + y3*x^3 + y4*x^4))^2/2/sy] + b;
fit = FindFit[data, expr, {{y0, #}, {y1, 0}, {y2, 0}, {y3, 0}, {y4, 0}, {sy, 5}, {a, 0.2}, {b, 0.3}}, {x, y}] & /@ {75, 130, 175, 220, 264, 308, 351, 393, 435, 490}
выглядит как-то так вблизи
{{y0 -> 87.7292, y1 -> -0.146309, y2 -> 0.000279265, y3 -> 3.62452*10^-7, y4 -> -7.28475*10^-10, sy -> 4.45341, a -> 0.11059, b -> 0.293883},
{y0 -> 134.557, y1 -> -0.287593, y2 -> 0.00148697, y3 -> -2.73506*10^-6, y4 -> 1.73526*10^-9, sy -> 5.88032, a -> 0.186041, b -> 0.292935},
{y0 -> 175.161, y1 -> -0.216324, y2 -> 0.00129499, y3 -> -2.53724*10^-6, y4 -> 1.6346*10^-9, sy -> 6.31835, a -> 0.207331, b -> 0.29263},
{y0 -> 219.418, y1 -> -0.146834, y2 -> 0.000903935, y3 -> -1.76892*10^-6, y4 -> 1.11553*10^-9, sy -> 5.16709, a -> 0.246005, b -> 0.292465},
{y0 -> 263.825, y1 -> -0.0721467, y2 -> 0.000454634, y3 -> -9.13689*10^-7, y4 -> 5.80904*10^-10, sy -> 4.6724, a -> 0.271664, b -> 0.292343},
{y0 -> 307.561, y1 -> 0.0313504, y2 -> -0.000230062, y3 -> 4.92199*10^-7, y4 -> -3.41197*10^-10, sy -> 4.70917, a -> 0.265807, b -> 0.292388},
{y0 -> 351.353, y1 -> 0.111996, y2 -> -0.000739691, y3 -> 1.48542*10^-6, y4 -> -9.68673*10^-10, sy -> 5.46529, a -> 0.236075, b -> 0.292496},
{y0 -> 393.196, y1 -> 0.174529, y2 -> -0.000967397, y3 -> 1.69454*10^-6, y4 -> -9.70441*10^-10, sy -> 6.22441, a -> 0.193682, b -> 0.292795},
{y0 -> 435.257, y1 -> 0.187255, y2 -> -0.000874856, y3 -> 1.35374*10^-6, y4 -> -7.22933*10^-10, sy -> 6.19187, a -> 0.199524, b -> 0.292738},
{y0 -> 475.104, y1 -> 0.158682, y2 -> -0.000352023, y3 -> -2.07054*10^-7, y4 -> 5.87065*10^-10, sy -> 5.55553, a -> 0.140875, b -> 0.293453}}
сам по себе, особенно на краях, фит немного не справился,
Show[ImageReflect[gr], Plot[((y0 + y1*x + y2*x^2 + y3*x^3 + y4*x^4) /. #) & /@ {fit}, {x, 1, Length[grd[[1]]]}, PlotStyle -> {Red, Thick}]]
надо ему аккуратнее подсказывать начальные условия, ну или картинку с нормальной освещённостью снять.
останется сделать то же самое по вертикали, получится dx,dy от (x,y) и потом вывернуть полиномы для обратного преобразования.
но вот делать это полностью автоматически без подсказок внутри esp32 я бы не стал, на время калибровки wifi/синезуб поднять для получения картинки будет имхо куда проще.