OJODIGITAL |
|
|
|
| Debates sobre la programación Para tratar temas sobre programación |
![]() |
| Publicidad |
|
||||
|
Cita:
Lo que no entiendo entonces es porqué los clipf? En cualquier caso lo de convertirlo a 32 bits sería para futuras versiones, juguemos con lo que hay ahora mismo no? El buffer1 yo lo trasladaría al punto 3, porque lo vamos a necesitar para el balance de blancos por parches y más adelante en perfectBLEND. Estás seguro que vale la pena aplicar reducción de ruido en perfectBLEND? su filosofía es eliminar ruido mediante la sobreexposición, para NUNCA perder textura. Aunque bueno, si es opcional podria estar bien, reducción de ruido en RAW!
__________________
"En ocasiones veo halos." Canon EOS 350D | EOS 300 | 10-22 | 24-70 f2.8L | 70-200 f4L | 300 f4L IS http://www.guillermoluijk.com para suscribirte pulsa aquí |
|
||||
|
Cita:
![]() ![]() ![]() , ya lo quitaré cuando no mires .Cita:
Cita:
perfectBLEND recibirá el buffer2 que saldrá de justo antes del WB y el resultado se reinsertará en ese mismo punto. A partir de ahí dcraw.dll continuará el revelado para poder ver el resultado en pantalla. Por su lado perfectBLEND grabará el DNG también a partir de ese mismo punto, sin pasar por dcraw.dll, claro. Un saludo: Última edición por ManuelLlorens; 21-may-2008 a las 12:59. |
|
|||
|
Gracias Manuel, lo de los 32 y 16 bits me ha quedado perfectamente claro: cálculos intermedios parciales durante el revelado en 32bits, convirtiendo de 16 a 32 y luego nuevamente a 16. Las salidas de cada etapa en 16 bits.
Eso además no se puede cambiar por ahora, porque es como lo hace dcraw y supondría tener que hacer todas las etapas nosotros. Lo de la gamma también está clara. Cuando se muestra en pantalla se utiliza siempre sRGB y al almacenar la que escoja el usuario para la salida (normalmente la correspondiente al espacio de color seleccionado, aunque el usuario la podrá cambiar). --------------------- Ahora algún comentario administrativo: El hilo lo he puesto como destacado en este foro, porque será como nuestra "biblia" o guía de referencia, para que todos tengamos claro cómo se hace. Si en las discusiones se llega a decidir que hay que cambiar algo en el flujo de trabajo, os ruego que editéis el primer mensaje para reflejar el cambio en el flujo de trabajo, dejando una anotación de qué se ha cambiado: Algo así: Flujo de trabajo actual: 1.-Demosaicing. 2.-WB 3.-Interpolación... 4.-Eliminación de ruido ..... Historial de flujo de trabajo: 1.- Demosaicing 2.- Interpolación. 3.- WB Editado: La interpolación se ha decidido ponerla antes del WB para no crear artefactos (20-05-2008) (REFERENCIA AL HILO DONDE SE COMENTA EL CAMBIO). <_GUI_>: que nu, que es al revés, la imagen se balancea primero (scale_colors()) y luego se interpola. 2.-WB 3.-Interpolación FIN EDICIÓN 4.-Eliminación de ruido ..... Esto sólo pretende ser un ejemplo, nos permitirá ver en todo momento cómo se ha decidido hacer la implementación del revelado, qué cambios ha sufrido y por qué se ha cambiado algo. Última edición por _GUI_; 21-may-2008 a las 15:54. |
|
|||
|
Si la etapa 2 no lleva mucho tiempo y además el usuario no la controla (es completamente automática no veo la necesidad del buffer 1 a su salida.
En todo caso lo pondría después de la etapa 3, en el que el usuario puede cambiar algo y afectar a la salida. Así cuando cambie el balance de blancos, se empezaría desde la salida del buffer 1, evitando los pasos 1,2 y 3. En cualquier caso las etapas entre 1 y 5 parece que son rápidas, por lo que se podría eliminar el buffer 1 ¿no? Por otra parte el buffer2 debería de estar a la salida de la etapa 5 de eliminación de ruido (que pones que es lenta) y antes de la 6 que es ajustable. Así ante cambios en los parámetros de las aberraciones cromáticas (¿esto va a ser ajustable según pones no?) se empezaría desde la etapa 5 después del procesado de ruido. El buffer 3 no hace falt, pues el esuilibrio de canales verde es automático y muchos de los procesos de después también. No tengo muy claro sobre qué procesos actúa el usuario mediante la interface y cuáles son automáticos (sean más o menos lentos). Estaría muy bien que resaltaras con otro color aquéllas etapas sobre las que el usuario puede cambiar algo ajustando parámetros en la interface ("etapas ajustables"). Creo que para optimizar el rendimiento y el consumo de memoria es crítico saber esto (sé que vosotros lo tenéis claro). Los únicos puntos en donde un buffer puede ayudar es justo antes de una etapa en la que el usuario pueda influir modificando algún parámetro (etapas ajustables). Cuando el usuario cambia algo en una etapa ajustable A, habrá que rehacer todos los procesos desde el buffer almacenado previo a la etapa A correspondiente. Para ahorrar buffers, si entre dos etapas A y B que sean ajustables los procesos a realizar son bastante rápidos, nos podemos ahorrar el buffer previo a la etapa B y empezar todo desde el buffer previo a la A cuando el usuario cambie algo que afecte a la etapa A o a la B. Si estás de acuerdo con esto, Manuel, habría que revisar si los buffer puesto siguen esta filosofía. Última edición por ariznaf; 21-may-2008 a las 14:24. |
|
|||
|
Cita:
Precisamente el revelador hará el demosaicing y ajustes de color de la cámara y demás, con lo cuál dejará de ser un RAW. El DNG también puede almacenar la imagen una vez hecho el demosaicing y demás, pero para eso también lo podemos guardar en TIFF o cualquier otro formato escogido por el usuario. El usar DNG para esto, puede provocar confusión, pues (al menos yo) el DNG lo asocio a un formato RAW y si guardamos lo hecho por PerfectRaw en un DNG lo que habrá en su interior no será para nada un archivo raw sino procesado. Además guardar en DNG supondrá un esfuerzo que no creo que por ahora merezca la pena y no se gana nada. Más bien introduce confusión, como dije. Claro que puede haber ventajas que yo no vea... Para PerfectBlender la historia cambia completamente, claro, ya que lo ideal en PerfectBlender es hacer la unión de las imágenes sin ningún procesado, incluso antes del demosaicing para que el procesado se haga posteriormetne con el revelador favorito (PerfectRaw u otro). Además descarga a PerfectBlender de tener que implementar tareas que ya están en PerfectRaw. Ahí grabar en DNG sí que es un plus claro. Mientras lo de grabar DNG no esté disponible, habrá que conformarse con procesar luego la imagen y ponerla en el portapapeles. Lo ideal podría ser que perfectblender fuera un submódulo de PerfectRaw. En vez de seleccionar abrir un archivo tener una opción "Componer imágenes sin ruido" o algo así. Abrir ahí PerfectBlender y que lo que salga de éste sea el Buffer0 para que PerfectRaw lo siga procesando. Última edición por ariznaf; 21-may-2008 a las 14:49. |
|
||||
|
Cita:
Un saludo: |
|
||||
|
Cita:
Todos los buffers son necesarios, salvo el buffer 0, que de hecho no se está almacenando; aunque, según qué parámetros se modifiquen se usarán unos u otros. Eso ocurrirá automáticamente en la próxima versión. He retocado el flujo del revelado, lo había hecho esta mañana de cabeza y había alguna cosa cambiada, quizás de ahí la confusión. Un saludo: Última edición por ManuelLlorens; 21-may-2008 a las 17:49. |
|
||||
|
Oye si cada paso se hace en 16 bits con redondeo, las curvas para la corrección de exposición pueden meterse en LUTs precalculadas en tiempo real para cada valor de exposición no? lo digo por el pow ése que se ha colado para las subexposiciones.
__________________
"En ocasiones veo halos." Canon EOS 350D | EOS 300 | 10-22 | 24-70 f2.8L | 70-200 f4L | 300 f4L IS http://www.guillermoluijk.com para suscribirte pulsa aquí |
|
||||
|
Cita:
Lo que hicimos al meter la gamma en dcraw es absurdo. ¿Recuerdas que al principio estaba mal porque creíamos que los valores estaban normalizados 0-1? En ese punto debimos darnos cuenta. En fin, de todo se aprende. En vez de calcular en float lo que hay que hace es una LUT ushort->ushort calculada en float, como la que he implementado ahora en perfectImage.dll para la sRGB en perfectRAW. Lo gracioso es que es exactamente igual de precisa pero infinitamente más rápida. Se tarda menos en calcular la LUT directamente porque son sólo 65536 valores y luego ir asignando en la imagen cada valor al que corresponde ya redondeado, se ahorran montones de operaciones. No hace falta ni siquiera el pow01 para tan pocos cálculos, basta con el powF que ya implementé. En cuanto pueda actualizo dcraw.dll (las LUTs, el cálculo de la gamma rápida en dcraw y el control de exposición nuevo, la gestión más inteligente de la memoria, vincularlo con LCMS y activar esas opciones... buff, cómo se acumula el trabajo). Cuando meta la gamma más rápida en dcraw cambiaré algún detalle del esquema de revelado de arriba y quitaré la gamma de perfectImage.dll Un saludo: Última edición por ManuelLlorens; 21-may-2008 a las 17:44. |
|
|||
|
Cita:
El buffer0 lo veo bien para no tener que leer el fichero cada vez que algo se cambie (yo no lo quitaría, ademas es el buffer más pequeño, pues todavía no tiene hecho el demosaicing). También puede ser el punto de unión con PerfectBlender (que ha de devolver ese buffer0). Pero el 1 sobraría según lo anterior, pues todas las etapas son más o menos rápidas y automáticas hasta el 6, por lo menos. Debería de estar puesto a la salida del 5 ¿no? Bueno lo de los patrones no sé muy bien en qué consiste. En cualquier caso incluso la etapa 6 según tu esquema es más o menos rápida. Pero puede ser razonable poner ahí un buffer para no tener que irse al principio del todo cada vez que se toque un canal de Balance de blancos (además seguirá siendo un buffer pequeño, con los valores aún sin interpolar). El buffer 2 lo pones antes de la interpolación de Bayer... pero esta es automática ?no? el usuario no tiene nada que tocar ahí. Según lo dicho antes sobraría o en todo caso tendría que estar antes del 8 (ala salida del 7) si es que la corrección de aberraciones cromáticas va a ser controlada por el usuario. El paso 10 ¿no es automático? ¿o es para dejar que se mezclen los canales con relaciones diferentes entre sí.... eso sólo tendría sentido en blanco y negro, no? |
|
||||||
|
Cita:
Código:
// Struct for passing parameters to the development process
typedef struct DCRAW_Parameters
{
float threshold; // -n -> buffer 2
double aber[4]; // -r -> buffer 2
int use_auto_wb; // -a -> buffer 2
int use_camera_wb; // -w -> buffer 2
unsigned greybox[4]; // -A -> buffer 2
int user_black; // -K -> buffer 2
int user_sat; // -S -> buffer 2
int test_pattern; // -> buffer 2
int level_greens; // -l -> buffer 2
int user_qual; // -q -> buffer 3
int four_color_rgb; // -f -> buffer 3
int med_passes; // -m -> buffer 4
int highlight; // -H -> buffer 4
int output_color; // -o -> buffer 5
int use_fuji_rotate; // -J -> buffer 5
float user_gamma; // -g -> buffer 5
float exposure; // -> buffer 3
int exposure_mode; // -> buffer 3
}DLL_PARAMETERS;
Cita:
Todos los buffers, salvo el de salida final tienen el mismo tamaño width*height*4*2 bytes, porque tienen cuatro canales (RGGB) de 16 bits. Antes del demosaicing tienen agujeros que ocuparán los valores interpolados, pero no ocupan menos. El de salida es RGB y ocupa, por tanto, un poco menos: width*height*3*2. No hay más tipos de buffers. Cita:
A continuación vienen los siguientes parámetros: user_black, user_sat que controlan el punto negro y el de saturación respectivamente. Se aplican a la vez que el parámetro threshold, que controla la reducción de ruido RAW. Luego vienen los parámetros de balance de blancos y finalmente la eliminación de aberraciones cromáticas, la generación de patrones y el equilibrado de canales verde. Salvo la reducción de ruido, que es lenta, todo lo demás es rápido. Por eso se pone un buffer al terminar este punto y justo antes de interpolar. Si se cambia la interpolación, que ya de por sí es lenta, ¿no vamos a hacerla más lenta teniendo que revelar desde más atrás, no? Cita:
Cita:
Cita:
Creo sinceramente que los buffers son los mínimos imprescindibles y que se toman en el punto adecuado. Si cuentas las etapas que están en negrita (las lentas, son 6) verás que coinciden con el número de buffers (del 0 al 5). Y están tan pronto después de las etapas lentas como es prudente ponerlos. Quizás en los puntos 11, 12 y 13 pueda ajustarse algo, como poner un buffer nuevo entre en 11 y el 12, o mover el buffer4 al justo después del 12, pero no veo que se gane nada y se desperdicia memoria. En la elección de los puntos para tomar los buffers también se ha tenido en cuenta el posible uso que futuras aplicaciones hagan de ellos. Mi idea es que la DLL permita a cualquier aplicación solicitar un buffer cualquiera y que la DLL revele hasta ese punto, la aplicación modifique el buffer, lo devuelva a la DLL y esta prosiga con el revelado. Es una especie de sistema de plugins para ampliar la funcionalidad de dcraw sin modificar nunca el código de Coffin. Es la versión más ambiciosa de la filosofía del proyecto: aprovechar el código de Coffin sin tocar una sola línea de él. Algunas de las cosas que están metidas ahora de otro modo (como la corrección gamma), irán más adelante implementadas de ese modo. Como ya he dicho antes, la DLL gestionará de manera transparente qué buffers utiliza y cuáles deja vacíos en función de los parámetros que se hayan especificado. Esto es así porque algunas etapas con los parámetros por defecto no hacen nada y pueden obviarse, pero hay otras que siempre hacen algo y esos buffers siempre habrá que llenarlos. También es importante aclarar que perfectRAW no tiene acceso a los buffers intermedios, solo al buffer final. Futuras versiones de perfectRAW o perfectBLEND serán otro cantar. Un saludo: Última edición por ManuelLlorens; 21-may-2008 a las 20:52. |
|
|||
|
Pues ha quedado bastante claro...
En el esquema que habías puesto creía que había varios pasos no dependientes de selecciones del usuario, pero la verdad es que son muy pocos. Por tanto hay poco que rascar. Tampoco se va a poner un buffer en cada etapa, así que los que has puesto parecen muy razonables. Y salvo que el incremento en velocidad pudiera ser muy grane, no conviene poner buffers intermedios en aquéllas etapas en que dcraw lo haga en una sola función. Creo que la filosofía que tienes de tocar lo menos posible el código de Coffin es la que hay que seguir a toda costa, para evitar muchos futuros quebraderos de cabeza cuando se cambie la versión de dcraw. Lo que dices del buffer 0 me parece muy razonable, eso que nos ahorramos y el punto negro de la cámara no será algo con lo que uno quiera andar jugando cada dos por tres. Si se cambia no pasa nada por tener que leerlo. Me ha sorprendido lo que dices de que todos los buffers tienen el mismo tamaño del númerodepixels*8. Esperaba que antes del demosicing uno trabajara con una información "en escala de grises" y que fueran de numerodepixels*2. De hecho, en cada pixel sólo se capta la información del canal correspondiente al filtro de la matriz ¿no? por tanto los otros canales no tienen utilidad hasta el momento de hacer el demosicing en que se generan todos los canales. Me imagino que esto se debe a la forma de trabajo interna del dcraw. Pero ahí sí que se puede ganar mucha memoria: Para una cámara de N megapixels, el tamaño de un buffer con los cuatro colores sería de 8*N, mientras que si almacenamos únicamente un color sería de 2*N. como hay dos buffers antes del demosicing (interpolación de Bayer) serían 8*N frente a 4*N. para una imagen estandar de 10MP estaríamos hablando de 160MB frente a 40MB. Los buffers posteriores serán iguales para los dos métodos (6*N) y como hay tres hablamos de 18N, es decir ocuparán 180MB. Así con tal y como está hablamos de un total de 160MB + 180MB= 340MB. Si se almacenara solo el canal que se ha tomado en las primeras fases, hablaríamos de 220MB un 35% menos. Claro que si DCRaw espera el buffer como cuatro canales, hay que entregárselo así... lo único que se me ocurre es utilizar un sistema de codificación de canales para almacenar en el buffer solo el canal que interesa y decodificarlo antes de pasarlo a DCRaw (utilizando la matriz de Bayer para saber qué canal interesa). En cualquier caso no es nada que se haya de implementar en la primera versión, podría ser una mejora para el futuro para consumir menos memoria (siempre y cuando el algoritmo de codificación fuera muy rápido claro). La verdad es que da escalofríos la cantidad de memoria necesaria y la cantidad de información que se genera de una sola imagen. |
|
||||
|
Manuel, la conversión a espacio de color + gamma sí se hace en float no? es decir que la gamma la aplicamos a un resultado aún no redondeado, y una vez aplicada se hace clipf. Es qeu si no es así no me explico que el histograma esté tan lleno de niveles en la parte baja.
__________________
"En ocasiones veo halos." Canon EOS 350D | EOS 300 | 10-22 | 24-70 f2.8L | 70-200 f4L | 300 f4L IS http://www.guillermoluijk.com para suscribirte pulsa aquí |
|
||||
|
Sí, ahí si, pero no utiliza un buffer solo cuatro valores float (uno por canal).
Última edición por ManuelLlorens; 22-may-2008 a las 12:14. |
|
||||
|
Cita:
Un saludo: |
|
||||
|
Cita:
|