Niveles RGB de Photoshop con ImageMagick

Estoy intentando convertir algunos efectos creados en Photoshop en código para usar con php/imagemagick. En este momento, estoy específicamente interesado en cómo recrear la función de niveles RGB de Photoshop. No estoy muy familiarizado con la interfaz de Photoshop, pero esta es la información que me dan:

RGB Level Adjust
  Input levels: Shadow 0, Midtone 0.92, Highlight 255
  Output levels: Shadow 0, Highlight 255

¿Qué son exactamente los niveles de entrada frente a los niveles de salida? ¿Cómo traduciría esto a ImageMagick? A continuación puede ver lo que he intentado, pero no genera correctamente el efecto deseado (convirtiendo la escala 0-255 de Photoshop a 0-65535):

$im->levelImage(0, 0.92, 65535);
$im->levelImage(0, 1, 65535);

Esto fue principalmente una puñalada en la oscuridad ya que los nombres de los parámetros no se alinean y para los niveles de salida, la cantidad de parámetros ni siquiera coincide. Básicamente, no entiendo exactamente qué sucede cuando Photoshop aplica el ajuste. Creo que ese es mi mayor obstáculo en este momento. Una vez que obtenga eso, tendré que encontrar los efectos correspondientes en ImageMagick.

¿Alguien puede arrojar algo de luz sobre lo que está pasando en Photoshop y cómo replicar eso con ImageMagick?

preguntado el 22 de mayo de 12 a las 19:05

No estoy seguro de que quiera una aclaración sobre el uso de la API tanto como quiere saber cómo reproducir el efecto de Photoshop usándola. -

3 Respuestas

Las sombras, los medios tonos y las luces son colores que se encuentran dentro de un cierto rango de luminosidad. Por ejemplo, las sombras son el rango más bajo del histograma de luminosidad, los medios tonos son los colores en el medio y los reflejos son los que están arriba. Sin embargo, no puede usar un límite estricto en estos valores, por lo que tendrá que usar curvas como estas que pesan el histograma (un píxel puede estar en múltiples rangos al mismo tiempo).

Sombras, tonos medios y luces

Para ajustar las sombras, los medios tonos y las luces por separado, deberá crear una suma ponderada por píxel que use los valores actuales de sombra, medios tonos y luces para crear un valor resultante.

No creo que pueda hacer esto directamente usando las API de ImageMagick; tal vez podría simplemente escribirlo como un filtro.

Espero que esto ayude.

contestado el 22 de mayo de 12 a las 21:05

Según tengo entendido, las sombras y los reflejos son parábolas, ¿no? Pero, ¿cuál sería una fórmula de la misma? - maksim sorokin

@MaksimSorokin No, son gaussianos (en.wikipedia.org/wiki/Gaussian_function) debidamente escalados y traducidos. - Ani

Así que me topé con este sitio web: http://www.fmwconcepts.com/imagemagick/levels/index.php

Según la información allí, pude crear el siguiente php que parece bastante efectivo para simular lo que hace Photoshop con entrada y salida y todo eso.

function levels($im, $inshadow, $midtone, $inhighlight, $outshadow, $outhighlight, $channel = self::CHANNEL_ALL) {
    $im->levelImage($inshadow, $midtone, $inhighlight, $channel);
    $im->levelImage(-$outshadow, 1.0, 255 + (255 - $outhighlight), $channel);
}

Esto supone que los parámetros para levelImage para punto negro y punto blanco están en una escala de 0-255. En realidad, podrían ser 0-65535 en su sistema. Si es así, es bastante fácil ajustarlo. También puede verificar qué valor usa su configuración con $im->getQuantumRange(). Devolverá una matriz con una versión de cadena y una versión larga del cuanto. A partir de ahí, debería ser bastante fácil normalizar los valores o simplemente usar el nuevo rango.

contestado el 23 de mayo de 12 a las 21:05

alguna forma de implementar esto en GD? - licuadora alfa

¿Tendrías un ejemplo de trabajo completo? ¿O cómo se aplica el código a la imagen? Esto es algo que estoy necesitando. - Panamá Jack

$im es un objeto IMagick (una imagen debería haberse cargado previamente en eso). Simplemente aplique el código que ve arriba a su imagen de IMagick. - Gregghz

¿Alguien puede explicar cómo es válido el valor -$outshadow? Entiendo que los valores de entrada para levelImage deben estar entre 0 y 255, ¿qué sucede con un valor negativo? Además, ¿el valor destacado de (255 + (255 - $ destacado)) siempre será 255 o superior? Una vez más, pensé que levelImage quiere un valor entre 0 y 255. - raveano

Consulte las documentación: El primer valor es el valor de entrada del punto negro (sombra), el medio es una gamma (que supongo que es el mismo que el punto medio de Photoshop), y el último es el valor de entrada del punto blanco (resaltado).

Los valores de salida se fijan en los valores cuánticos del tipo de imagen, no es necesario especificarlos.

contestado el 22 de mayo de 12 a las 19:05

ver, pero eso es más o menos lo que he intentado y no produce los mismos resultados que en Photoshop - Gregghz

@greggory.hz, "no produce los mismos resultados" no es muy descriptivo. Ayúdanos a ayudarte. - marca rescate

Tienes razón, eso no es muy descriptivo. Pero eso fue intencional ya que espero un mapeo uno a uno de Photoshop a la magia de imágenes. Sospecho que eso no es probable. Entonces, en lugar de eso, estaría encantado con los recursos para comprender cómo funcionan los niveles rgb de Photoshop para poder obtener el conocimiento de bajo nivel para ajustar correctamente (en lugar de simplemente sin rumbo fijo) para lograr los resultados que quiero. - Gregghz

@ greggory.hz Vea mi respuesta anterior, tiene como objetivo hacer exactamente eso. - Ani

@greggory.hz, no uso Photoshop ni ImageMagick, pero sé lo suficiente sobre los fundamentos para proporcionar una respuesta correcta si no estuviera trabajando a ciegas. Según la información que tengo, ya sea $im->levelImage(0, 0.92, 65535); or $im->levelImage(0, 0.92, 255); debe ser exactamente equivalente a Photoshop. Si no es así, por favor dígame qué tan lejos está. - marca rescate

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.