2009-10-08 21 views
5

Quiero leer los valores RGB para cada píxel desde una imagen sin formato. ¿Puede alguien decirme cómo lograr esto? ¡Gracias por la ayuda!Obtención de valores RGB para cada píxel desde una imagen sin procesar en C

el formato de mi imagen sin formato es .CR2 que viene de la cámara.

+2

Debe especificar cómo se representa la "imagen sin procesar" y qué formato es. – sharptooth

+2

Defina "imagen sin procesar". ¿Es un archivo de imagen? Si es así, ¿qué tipo de archivo? ¿O estás tratando de hacer una captura de pantalla?Edite su pregunta para agregar los detalles. – Artelius

+1

¿Qué formato es tu imagen "en bruto"? ¿Es quizás un mapa de bits o un archivo de imagen tomado de una cámara? – ChrisBD

Respuesta

1

Una imagen RAW es un formato sin comprimir, por lo que solo tiene que señalar dónde está su píxel (omitiendo cualquier encabezado posible y luego agregando el tamaño del píxel multiplicado por el número de columnas multiplicado por el número de fila más el número del colum), y luego lea cualquier dato binario que esté dando un formato significativo al diseño de los datos (con máscaras y turnos, ya sabe).

Ese es el procedimiento general, para su formato actual deberá verificar los detalles.

4

Suponiendo que la imagen es w * h píxeles, y se almacena en verdadero formato RGB "empaquetado" sin componente alfa, cada píxel requerirá tres bytes.

en la memoria, la primera línea de la imagen puede ser representado en gráficos impresionantes ASCII como esto:

R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1) 

Aquí, cada R n G n y B n representa un solo byte , dando el componente rojo, verde o azul del píxel n de esa línea de exploración. Tenga en cuenta que el orden de los bytes puede ser diferente para diferentes formatos "crudos"; no hay un estándar mundial acordado. Diferentes entornos (tarjetas gráficas, cámaras, ...) lo hacen de manera diferente por cualquier razón, simplemente tiene que conocer el diseño.

Lectura de un píxel a continuación, se puede hacer por esta función:

typedef unsigned char byte; 
void get_pixel(const byte *image, unsigned int w, 
       unsigned int x, 
       unsigned int y, 
       byte *red, byte *green, byte *blue) 
{ 
    /* Compute pointer to first (red) byte of the desired pixel. */ 
    const byte * pixel = image + w * y * 3 + 3 * x; 
    /* Copy R, G and B to outputs. */ 
    *red = pixel[0]; 
    *green = pixel[1]; 
    *blue = pixel[2]; 
} 

Observe cómo no se necesita la altura de la imagen para que esto funcione, y cómo la función está libre de los límites de comprobación. Una función de calidad de producción podría estar más blindada.

actualización Si está preocupado este enfoque será demasiado lenta, se puede, por supuesto, solo bucle sobre los píxeles, en lugar:

unsigned int x, y; 
const byte *pixel = /* ... assumed to be pointing at the data as per above */ 

for(y = 0; y < h; ++y) 
{ 
    for(x = 0; x < w; ++x, pixel += 3) 
    { 
    const byte red = pixel[0], green = pixel[1], blue = pixel[2]; 

    /* Do something with the current pixel. */ 
    } 
} 
+0

Si solo necesita consultar 1 píxel, su función está bien. Sin embargo, si necesita procesar todos los píxeles, esta función no es la correcta, ya que es demasiado lenta (sobrecarga de funciones + 3 multiplicaciones por cada píxel) – Toad

+0

@reinier: Eso podría ser cierto, suponiendo que no hay alineación. Agregué un fragmento explícitamente anidado para mostrar eso también. Gracias. – unwind

+0

@unwind Tengo un archivo jpg, utilicé imagemagick y umbral aplicado, y eso cambia todos los píxeles por encima del valor de umbral como negro y otros como blanco. Ahora, quiero verificar cada píxel, si es negro o blanco. ¿Funcionará el método anterior? ¿Cuál será el valor para rojo, verde y azul? 255? – Kraken

5

Ninguno de los métodos informados hasta ahora son propensos a trabajar con un archivo de cámara "en bruto". Los formatos de archivo para archivos sin procesar son exclusivos de cada fabricante y pueden contener datos de exposición, constantes de calibración e información de balance de blancos, además de los datos de píxeles, que probablemente estarán en un formato empaquetado donde cada puxel ocupará más de un byte. , pero menos de dos.

Estoy seguro de que hay programas de conversión de archivos sin formato de código abierto que podrías consultar para descubrir los algoritmos que se usarán, pero no conozco ninguno de ellos.


acaba de pensar en una complicación adicional. El archivo sin formato no almacena los valores RGB para cada píxel. Cada píxel registra solo un color. Los otros dos colores tienen que ser interpolados desde píxeles vecinos. Definitivamente será mejor que encuentre un programa o una biblioteca que funcione con su cámara.

Cuestiones relacionadas