Vaya, se ha juntado aquí casi toda la élite del PTeam
.
Entonces, mi sugerencia es tomar un valor arbitrario para la MTF, y un valor definido para el usuario para la mediana final. Calculas el valor de la mediana. Si te pasas (valor mas alto), acercas la MTF mas a 0.5 (a la mitad de distancia que antes), y repites el calculo. Si esta por debajo del valor ideal, lo aplicas a la imagen
Creo que es más o menos lo que pienso yo. Estoy definiendo el algoritmo más o menos en esta dirección:
- Pedir al usuario número de iteraciones (N) y mediana objetivo.
- Partir de un valor arbitrario de MTF, tal como dices.
- Aplicar la MTF al valor de la mediana actual N veces.
- Ver la mediana alcanzada y modificar la MTF consecuentemente, volviendo al paso anterior hasta que la diferencia sea despreciable.
- Aplicar finalmente el histograma a la imagen N veces usando el valor de medios tonos "calculado".
- Por último, aplicar a la imagen final (Edito: este paso está repetido, es el mismo que el anterior).
El problema de esto es, tal como anticipas, que el valor se ha averiguado sin máscaras. Así que ya voy pensando en otra cosa...
- Pedir al usuario número de iteraciones (N) y mediana objetivo.
- Crear una imagen nueva consistente en un recorte pequeño de la imagen original, tal que la mediana del recorte y la de la imagen original sean bastante parecidas. Dado que el usuario va a aplicar un histograma, podemos asumir que el fondo está neutralizado y por tanto probar un recorte en cualquier esquina.
- Escoger un valor inicial de MTF arbitrario.
- Con esta imagen, aplicar el procedimiento entero, con máscaras y todo, las N veces necesarias. Dado que la imagen no hay que mostrarla en pantalla (de la misma forma que el script actual no muestra las máscaras que se van generando), es transparente al usuario. Y como el recorte es pequeño, se hace en un pispás.
- Evaluar la mediana, descartar la imagen pequeña y alterar la MTF en función del resultado obtenido. Volver a crear la imagen y repetir desde el paso anterior hasta que la diferencia de medianas sea despreciable.
- Finalmente, aplicar a la imagen grande.
Lo que sí tengo claro es que el número de iteraciones vendrá definido por el usuario. Así el usuario no sólo controla el tiempo de ejecución (como ya dije en otro mensaje) sino también la calidad del resultado.
Ahora estoy enfrascado con el sistema de autenticación de módulos que va a llevar la nueva versión que publicaré mañana...
Jeje, ya hace al menos un par de versiones que parte de este código ya anda por ahí verdad?
. Si te sirve de algo (que a estas alturas no creo), los del núcleo de Linux están metiendo PGP.
Con respecto a bugs, tengo uno de Statistics en el horno, me quiero asegurar bien. Creo que no lo pondré en la sección de bugs; total, siempre se puede mover después si resulta que tal.
Obviamente, tengo que añadir esta función MidtonesTransferFunction al runtime JS de PI. Lo haré en breve.
Y ya que está implementada como parte de la PCL, y obviamente funciona, ¿por qué no hacerla accesible mediante, por ejemplo, Math.mtf()? Ese fue el segundo sitio donde fui a buscarla, siendo el primero el objeto Image. Y como es cálculo puro, por muy búsqueda binaria que sea, siempre es mejor que se ejecute en código compilado, no? Y te ahorras la traducción a JS y el hacer un script de ejemplo que demuestre cómo se usa.
Y eso de publicar funcioncitas internas...
de aquí a la GPL hay un paso!