Pues no... el spline con sólo 3 puntos se me va de madre. Me devuelve un valor de MTF de 1060, o de -0.3. Se controla mejor con más puntos pero eso ya no me interesa.
Y hacerlo con cuadrática tampoco es factible, porque el código Perl que pensaba traducir utiliza un módulo externo. La implementación de splines la saqué del mismo libro, unas pocas páginas más adelante, y no usa módulos externos, es tan sólo una página y pico de código.
Así que vuelvo a estar en dique seco. He visto que una interpolación lineal iterativa quizá sea más rápida que la búsqueda binaria que había en la 0.4, pero me parece que el resultado va a ser 3/4 de lo mismo... voy a intentar atacarle, a ver.
1.- Si mediana objetivo < mediana actual, el usuario está oscureciendo la imagen. low = 0.5, high = 0.95.
2.- De lo contrario, low = 0.05, high = 0.5.
3.- Calculamos la mediana resultante al aplicar un(*) mtf a medio camino entre low y high. En este punto tenemos dos medianas: la recién calculada y la actual (mtf = 0.5). Ajustamos low y high.
4.- El objetivo está por ahí cerca, así que interpolamos linealmente entre low y high para obtener un valor de mtf aproximado.
5.- Calculamos el valor de la mediana en ese punto. Si es el objetivo, lo celebramos con un pantallazo azul
.
6.- Descartamos una de las variables iniciales (low o high), la que esté más lejos del punto interpolado. Ajustamos low o high según sea necesario.
7.- Volvermos al paso 4 ad infinitum.
Este algoritmo es mejorable (hay cosas repes), pero me queda poca batería y no pienso levantarme por el cable
. Ya encontraré el modo.
(*) Uno no, sino muchos, con máscara y recorte de sombras cuando esté implementado.