Cómo guardar una imagen en JPG con MATLAB
Guardar una imagen en formato JPG desde MATLAB es una de las primeras cosas que se necesitan en un curso de procesamiento de imágenes: guardar un resultado, enviarlo en un informe o comparar la calidad antes y después de un filtro. En este post te explico la función imwrite, el parámetro de calidad, la diferencia entre guardar una matriz de imagen y guardar una figura completa, y los errores más frecuentes.
El código básico (corregido)
El ejemplo original de este blog leía la imagen peppers.jpg. En realidad, la imagen de ejemplo que trae MATLAB se llama peppers.png, así que esta es la versión corregida que funciona en cualquier instalación con la Image Processing Toolbox:
close all; % Cerrar todas las figuras
clear; % Limpiar variables
clc; % Limpiar la ventana de comandos
x = imread('peppers.png'); % Leer la imagen de ejemplo
imwrite(x, 'peppers.jpg', 'Quality', 100); % Guardar en JPG con calidad máxima
imgjpg = imread('peppers.jpg'); % Volver a leer el archivo guardado
imshow(imgjpg);
title('Imagen guardada en JPG');
Qué hace cada línea
- imread lee el archivo y devuelve una matriz. Para una imagen a color es de tamaño filas × columnas × 3 (canales rojo, verde y azul) y de tipo
uint8(valores de 0 a 255). - imwrite(x, 'peppers.jpg', 'Quality', 100) guarda la matriz en disco. MATLAB deduce el formato por la extensión
.jpg. El parámetro Quality va de 0 a 100; si no lo pones, el valor por defecto es 75. - imread vuelve a cargar el archivo para comprobar que se guardó bien, e imshow lo muestra.
¿Qué significa la calidad en un JPG?
JPEG es un formato con pérdida: para reducir el tamaño del archivo descarta detalles que el ojo casi no percibe. Incluso con 'Quality', 100 hay una pequeña pérdida. Si necesitas que los píxeles queden exactamente iguales (por ejemplo, para medir algo en la imagen después), tienes dos opciones:
- Guardar en PNG, que es sin pérdida:
imwrite(x,'peppers.png'). - Usar JPEG sin pérdida:
imwrite(x,'peppers.jpg','Mode','lossless'). Ten en cuenta que no todos los visores de imágenes abren bien este tipo de JPG.
Ejemplo práctico: comparar calidades
Este pequeño script guarda la misma imagen con tres calidades y muestra el tamaño de cada archivo, para que veas el compromiso entre peso y nitidez:
x = imread('peppers.png');
calidades = [25 75 100];
for q = calidades
nombre = sprintf('peppers_q%d.jpg', q);
imwrite(x, nombre, 'Quality', q);
info = dir(nombre);
fprintf('Calidad %3d: %6.1f KB\n', q, info.bytes/1024);
end
Verás que con calidad 25 el archivo es mucho más liviano pero aparecen "bloques" en las zonas de color uniforme, mientras que con 100 el archivo pesa bastante más. Para informes y páginas web, una calidad entre 75 y 90 suele ser un buen equilibrio.
Guardar una imagen procesada (tipo double)
Muchas operaciones devuelven imágenes de tipo double. imwrite espera que una imagen double tenga valores entre 0 y 1; lo que esté por encima de 1 se guarda como blanco y lo que esté por debajo de 0, como negro. Por eso, antes de guardar, normaliza o convierte:
g = rgb2gray(imread('peppers.png')); % escala de grises, uint8
f = double(g) / 255; % pasar a double entre 0 y 1
f2 = f .^ 0.5; % corrección gamma (aclara la imagen)
imwrite(f2, 'peppers_gamma.jpg', 'Quality', 90);
% Alternativa: im2uint8(f2) convierte a 0..255 antes de guardar
Si quieres aprender más sobre este tipo de transformaciones, mira el post de corrección de imágenes en MATLAB: lineal, gamma y sigmoidal.
Guardar la figura completa (con ejes, títulos y gráficas)
imwrite guarda solo los píxeles de la matriz. Si lo que quieres es guardar la ventana completa, con títulos, ejes, leyendas o una gráfica, usa otras funciones:
imshow(imread('peppers.png')); title('Pimientos');
% En versiones recientes de MATLAB (R2020a en adelante):
exportgraphics(gcf, 'figura_pimientos.jpg', 'Resolution', 300);
% En versiones antiguas:
saveas(gcf, 'figura_pimientos.jpg');
print(gcf, 'figura_pimientos', '-djpeg', '-r300');
La opción -r300 o 'Resolution', 300 define los puntos por pulgada, útil cuando la imagen va a un documento impreso.
Errores comunes
| Mensaje o síntoma | Causa | Solución |
|---|---|---|
| "File 'peppers.jpg' does not exist" | El archivo no está en la carpeta actual ni en la ruta de MATLAB | Usa la ruta completa o cambia de carpeta con cd; recuerda que el ejemplo es peppers.png |
| La imagen guardada sale toda blanca | Imagen double con valores mayores que 1 | Divide entre 255 o usa mat2gray / im2uint8 |
| La imagen sale con bloques | Calidad JPG muy baja | Sube 'Quality' o guarda en PNG |
| Se guarda sin título ni ejes | Se usó imwrite en vez de exportar la figura | Usa exportgraphics, saveas o print |
| Error de permisos al escribir | Carpeta protegida (por ejemplo, la de instalación) | Guarda en Documentos o en tu carpeta de trabajo |
Preguntas frecuentes
¿Cuál es la diferencia entre .jpg y .jpeg?
Ninguna. Son dos extensiones para el mismo formato; MATLAB acepta ambas.
¿Por qué mi JPG pesa más que el PNG?
Ocurre con imágenes de pocos colores, como diagramas o capturas de pantalla, y con calidad 100. Para ese tipo de imágenes PNG suele ser mejor; JPG brilla con fotografías.
¿Puedo guardar varias imágenes en un ciclo?
Sí. Genera el nombre con sprintf, como en el ejemplo de calidades: sprintf('imagen_%03d.jpg', k) produce imagen_001.jpg, imagen_002.jpg, etc.
Otro post útil de la misma serie es cómo detener un programa en MATLAB al presionar una tecla, ideal si procesas imágenes en un ciclo.
Conclusión
Para guardar una imagen en JPG con MATLAB basta con imwrite(x,'archivo.jpg','Quality',q). Recuerda que JPG siempre pierde algo de información, que las imágenes double deben estar entre 0 y 1, y que para guardar la figura completa debes usar exportgraphics, saveas o print. Con estas tres ideas evitarás la mayoría de los problemas.
Comentarios