2009-10-20 115 views
5

¿Cómo leo una imagen en C para poder tener control directo sobre sus píxeles (como hacemos en MATLAB)?¿Cómo manipular una imagen a nivel de píxel en C?

Probé la vieja manera:

FILE *fp; 
fp = fopen("C:\\a.tif","r"); 

que sólo me da la forma del archivo de imagen (creo) ascii.

¿Cómo puedo obtener el control de nivel de píxeles sobre la imagen y realizar algunas operaciones básicas como, por ejemplo, invertir la imagen?

+1

C es un nivel un poco más bajo de lo que parece pensar que es. That fopen te está dando código binario en bruto, y tú debes decidir cómo interpretar ese binario como una imagen, o usar una biblioteca como se sugiere a continuación. – Breton

+0

@Breton, él específicamente preguntó cómo decodificar estos archivos, no el contenido binario. Creo que C es una mejor opción cuando quieres que tu programa sea rápido, de lo contrario, Python proporciona PIL, que es lo suficientemente bueno. – Xolve

+1

@Breton - That 'fopen()' no le proporciona ese binario en bruto, le proporciona el modo de texto, lo que significa que es probable que lea algunos archivos incorrectamente en Windows. –

Respuesta

2

OpenCV es biblioteca de visión por ordenador, pero puede ser utilizado para tareas de "bajo nivel" también. Es compatible con BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIF.

3

Eche un vistazo a libtiff. Casi todos los formatos de imagen tienen algún tipo de datos de encabezado y muchos están comprimidos para mantener el tamaño del archivo razonable. Por supuesto, puede escribir el código C para leer los encabezados y realizar la descompresión, pero no es necesario ya que alguien más ya lo ha hecho. Mire here para algunas bibliotecas de imágenes C.

Otra pregunta es en qué forma desea que estén los datos para la manipulación: una opción común es RGB de 24 bits (es decir, R, G y B varían entre 0 y 255). En MATLAB también ves R, G, B como dobles que varían de 0.0 a 1.0. O quizás prefiera un espacio de color diferente (HSV, YUV, etc.).

Recuerde que las operaciones de enteros son más rápidas, pero pueden ser más problemáticas.

+0

+1 para responder la pregunta de OP pero también para recordarles que no reinventen la rueda – JeffH

3

Para manipular jpeg archivos utilizan libjpeg, el tiff archivos utilizan libtiff, etc.

Otra opción fácil es gd que permite la manipulación de muchos formatos de imagen (PNG, JPEG, GIF, ...) .

1

Hay algunas librerías de código abierto para cargar imágenes de diferentes tipos y libtiff para cargar imágenes tiff. Si solo quieres jugar y el formato de archivo no es muy importante, entonces echaré un vistazo en el formato netpbm (en particular, P5 y P6). Es bastante fácil escribir un cargador y un protector para él y, por supuesto, un buen ejercicio.

Cuestiones relacionadas