Aplicar filtro a sequencia de imágenes para un video menos ruidoso [Solucionado]

no.. no estoy perdiendo precision, olo que ago es tomar los bytes (char) pasarlos a double, normalizarlos (hacer que 0=0.0, y 255=1.0), luego promedio 5 frames obteniendo otro valor de 0.0 a 1.0 que corresponderá al valor que tomará un pixel del frame filtrado, finalmente tengo que convertir ese valor en un byte es por eso que hago

char byte;
double pixel;

...
byte = (char) (256.0*pixel);
...

estoy usando imagenes ppm (o algo asi), que basicamente tiene una cabezera de unos cuantos bytes donde indica la resolucion de la imagen y el resto son trios de bytes (1 por pixel) que indican la intensidad del canal rojo, verde y azul de cada pizxel. Es por eso que necesito hacer la conversion...

SD0625 escribió:

no.. no estoy perdiendo precision, olo que ago es tomar los bytes (char) pasarlos a double, normalizarlos (hacer que 0=0.0, y 255=1.0), luego promedio 5 frames obteniendo otro valor de 0.0 a 1.0 que corresponderá al valor que tomará un pixel del frame filtrado, finalmente tengo que convertir ese valor en un byte es por eso que hago

char byte;
double pixel;

...
byte = (char) (256.0*pixel);
...

estoy usando imagenes ppm (o algo asi), que basicamente tiene una cabezera de unos cuantos bytes donde indica la resolucion de la imagen y el resto son trios de bytes (1 por pixel) que indican la intensidad del canal rojo, verde y azul de cada pizxel. Es por eso que necesito hacer la conversion...

256 ocupa 2 byte. El rango de un byte es de 0..255. Si el valor de pixel es 1, en byte va a quedar 0 (cero) Esto puede ser justamente lo que hace que cambie burscamente de color. Podrias cambiar la expresion por.

char byte;
double pixel;

...
byte = (char) (255.0*pixel);
...

Respecto de la presicion, la conversion te afecta de la siguiente manera:
si solo cambia la milesima (y posiciones siguientes...)
256 x 0.999 = 255.744 -> 255
256 x 0.998 = 255.488 -> 255
256 x 0.997 = 255.232 -> 255

Si solo cambia la diezmilesima (y posiciones siguiente)...
256 x 0.9999 = 255.9744 -> 255
256 x 0.9998 = 255.9488 -> 255
256 x 0.9997 = 255.9232 -> 255
256 x 0.9996 = 255.8976 -> 255
256 x 0.9995 = 255.872 -> 255
256 x 0.9994 = 255.8464 -> 255
256 x 0.9993 = 255.8208 -> 255
256 x 0.9992 = 255.7952 -> 255
256 x 0.9991 = 255.7696 -> 255
256 x 0.999 = 255.744 -> 255
256 x 0.9989 = 255.7184 -> 255
256 x 0.9988 = 255.6928 -> 255
256 x 0.9987 = 255.6672 -> 255
256 x 0.9986 = 255.6416 -> 255
256 x 0.9985 = 255.616 -> 255
256 x 0.9984 = 255.5904 -> 255
256 x 0.9983 = 255.5648 -> 255
256 x 0.9982 = 255.5392 -> 255
256 x 0.9981 = 255.5136 -> 255
256 x 0.998 = 255.488 -> 255
256 x 0.9979 = 255.4624 -> 255

Salvo que esto no afecte el resultado. Pero creo que con el tema del 256 podras resolver el cambio repentino de color.

Perdon por el doble post.

Ademas del tema del 255, tenes que considerar que byte = (char) (255.0*pixel) le indica al compilador que la zona de memoria del double la vea como un byte. Los double se manjean en punto flotante con mantiza y exponente (notacion cientifica).
Ej (notacion cientifica decimal):
12 = 1.2 * 10^1
12 = 0.12 * 10^2
En cada caso, tenes una mantiza y un exponente. El exponente puede ocupar un byte o mas de un byte y el resto la mantiza, por lo que si le digo al compilador que vea la expresion como un byte, va a tomar o parte de la mantiza o parte del exponente.

Probra de hacerlo de esta forma

  unsigned shortint i; /* porque estamos manejando 1 solo byte, seria como un char, pero se activa la logica de conversion */
  double db;
  char byte;

  db = (255.0 * pixel);

  /* aqui el compildaor si hace la conversion porque en la asignacion esta implicita la conversion*/
  i = db;

  /* debido a que el shotint ocupa la misma cantidad de bytes que el char, la conversion es directa y no hay     problemas*/
  byte = (char) i;

Espero que con esto puedas resolver el tema del color