Exportar a imágenes
Para exportar datos del espacio de trabajo de MATLAB® usando uno de los formatos de archivo gráfico estándar, use la función imwrite
. Con esta función, puede exportar datos en formatos como Tagged Image File Format (TIFF), Joint Photographic Experts Group (JPEG) y Portable Network Graphics (PNG). Para obtener una lista completa de los formatos admitidos, consulte la página de referencia de imwrite
.
El siguiente ejemplo escribe un arreglo multidimensional de datos uint8
I
del espacio de trabajo de MATLAB en un archivo con formato TIFF. La clase de la imagen de salida escrita en el archivo depende del formato especificado. Para la mayoría de formatos, si el arreglo de entrada es de clase uint8
, imwrite
genera los datos como valores de 8 bits. Consulte la página de referencia de imwrite
para obtener información.
whos I Name Size Bytes Class I 650x600x3 1170000 uint8 array Grand total is 1170000 elements using 1170000 bytes imwrite(I, 'my_graphics_file.tif','tif');
Nota
imwrite
admite diferentes sintaxis para varios formatos estándar. Por ejemplo, con el formato de archivo TIFF, puede especificar el tipo de compresión que MATLAB usa para almacenar la imagen. Consulte la página de referencia de imwrite
para obtener información.
Para tener un mayor control sobre la escritura de datos en un archivo TIFF, utilice el objeto Tiff
; consulte Exportar datos de imagen y metadatos a archivos TIFF para obtener más información.
Exportar datos de imagen y metadatos a archivos TIFF
Aunque puede usar imwrite
para exportar datos de imagen y metadatos (etiquetas) a archivos Tagged Image File Format (TIFF), la función tiene algunas limitaciones. Por ejemplo, cuando desee modificar datos de imagen o metadatos en el archivo, debe escribir todos los datos en el archivo. No puede escribir solo la parte actualizada. Con el objeto Tiff
, puede escribir partes de los datos de imagen y modificar o añadir etiquetas individuales a un archivo TIFF. Al crear un objeto Tiff
, este representa la conexión con un archivo TIFF y proporciona acceso a muchas de las rutinas de la biblioteca LibTIFF.
Las siguientes secciones proporcionan ejemplos paso a paso del uso de métodos y propiedades del objeto Tiff
para realizar algunas tareas comunes con archivos TIFF. Para aprovechar el objeto Tiff
al máximo, debe estar familiarizado con la especificación TIFF y las notas técnicas. Consulte esta documentación en LibTIFF - TIFF Library and Utilities .
Crear un nuevo archivo TIFF
Cree datos de imagen. Este ejemplo lee datos de imagen de un archivo JPEG incluido con MATLAB:
imgdata = imread('ngc6543a.jpg');
Cree un nuevo archivo TIFF construyendo un objeto
Tiff
, especificando el nombre del nuevo archivo como argumento. Para crear un archivo, debe especificar el modo escritura ('w'
) o el modo añadir ('a'
):t = Tiff('myfile.tif','w');
Cuando cree un nuevo archivo TIFF, el constructor de
Tiff
crea una archivo que contiene un directorio de archivos de imagen (IFD). Un archivo TIFF usa este IFD para organizar todos los datos y metadatos asociados a una imagen concreta. Un archivo TIFF puede contener varios IFD. El objetoTiff
hace que el IFD que crea sea el IFD actual. Los métodos del objetoTiff
funcionan con el IFD actual. Puede navegar entre los IFD de un archivo TIFF y especificar qué IFD es el IFD actual usando los métodos del objetoTiff
.Establezca las etiquetas de TIFF requeridas usando el método
setTag
del objetoTiff
. Estas etiquetas requeridas especifican información sobre la imagen, como su largo y ancho. Para dividir los datos de la imagen en tiras, especifique un valor para la etiquetaRowsPerStrip
. Para dividir los datos de la imagen en mosaicos, especifique valores para las etiquetasTileWidth
yTileLength
. El ejemplo crea una estructura que contiene nombres y valores de etiquetas y los pasa asetTag
. También puede establecer cada etiqueta individualmente.tagstruct.ImageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct.Software = 'MATLAB'; tagstruct % display tagstruct setTag(t,tagstruct)
Para obtener información sobre las etiquetas TIFF compatibles y cómo establecer sus valores, consulte Establecer valores de etiquetas. Por ejemplo, el objeto
Tiff
admite propiedades que puede usar para establecer los valores de ciertas propiedades. Este ejemplo usa la propiedadPlanarConfiguration
del objetoTiff
para especificar el valor correcto de la configuración chunky:Tiff.PlanarConfiguration.Chunky
.Escriba los datos y metadatos de la imagen en el directorio actual usando el método
write
del objetoTiff
.write(t,imgdata);
Si desea poner varias imágenes en el archivo, llame al método
writeDirectory
justo después de realizar esta operación de escritura. El métodowriteDirectory
configura un nuevo directorio de archivos de imagen en el archivo y convierte este nuevo directorio en el directorio actual.Cierre la conexión con el archivo cerrando el objeto
Tiff
:close(t);
Compruebe que ha creado un archivo TIFF válido usando la función
imread
para leer el archivo y después muestre la imagen:imagesc(imread('myfile.tif'));
Escribir una tira o un mosaico de datos de imagen
Nota
Solo puede modificar una tira o un mosaico de datos de imagen si los datos no están comprimidos.
Abra un archivo TIFF existente para modificarlo creando un objeto
Tiff
. Este ejemplo usa el archivo creado en Crear un nuevo archivo TIFF. El constructor deTiff
devuelve un identificador a un objetoTiff
.t = Tiff('myfile.tif','r+');
Genere algunos datos para escribir en una tira en la imagen. Este ejemplo crea un arreglo tridimensional de ceros del tamaño de una tira. El código usa el número de filas en una tira, el ancho de la imagen y el número de muestras por píxel como dimensiones. El arreglo es un arreglo de valores
uint8
.width = getTag(t,'ImageWidth'); height = getTag(t,'RowsPerStrip'); numSamples = getTag(t,'SamplesPerPixel'); stripData = zeros(height,width,numSamples,'uint8');
Si los datos de imagen tuvieran un diseño en mosaico, usaría las etiquetas
TileWidth
yTileLength
para especificar las dimensiones.Escriba los datos en una tira en el archivo usando el método
writeEncodedStrip
. Especifique el número de índice que identifica la tira que desea modificar. En el ejemplo se elige la tira 18 porque es más fácil ver el cambio en la imagen.writeEncodedStrip(t,18,stripData);
Si la imagen tuviera un diseño en mosaico, usaría el método
writeEncodedTile
para modificar el mosaico.Cierre la conexión con el archivo cerrando el objeto
Tiff
.close(t);
Pruebe que ha modificado una tira de la imagen en el archivo TIFF usando la función
imread
para leer el archivo y después muestre la imagen.modified_imgdata = imread('myfile.tif'); imagesc(modified_imgdata)
Observe la tira negra que hay en medio de la imagen.
Modificar los metadatos de archivos TIFF (etiquetas)
Abra un archivo TIFF existente para modificarlo utilizando el objeto
Tiff
. Este ejemplo usa el archivo creado en Crear un nuevo archivo TIFF. El constructor deTiff
devuelve un identificador a un objetoTiff
.t = Tiff('myfile.tif','r+');
Verifique que el archivo no contenga la etiqueta
Artist
utilizando el métodogetTag
. Este código debe emitir un mensaje de error que indica que no se ha podido recuperar la etiqueta.artist_value = getTag(t,'Artist');
Añada la etiqueta
Artist
usando el métodosetTag
.setTag(t,'Artist','Pablo Picasso');
Escriba los nuevos datos de etiqueta en el archivo TIFF usando el método
rewriteDirectory
. Use el métodorewriteDirectory
al modificar los metadatos existentes en un archivo o al añadir nuevos metadatos a un archivo.rewriteDirectory(t);
Cierre la conexión con el archivo cerrando el objeto
Tiff
.close(t);
Compruebe lo que ha hecho volviendo a abrir el archivo TIFF y obteniendo el valor de la etiqueta
Artist
utilizando el métodogetTag
.t = Tiff('myfile.tif', 'r'); getTag(t,'Artist') ans = Pablo Picasso close(t);
Crear subdirectorios de archivos TIFF
Cree datos de imagen. Este ejemplo lee datos de imagen de un archivo JPEG incluido con MATLAB. El ejemplo crea dos versiones de resolución reducida (miniaturas) de los datos de imagen.
imgdata = imread('ngc6543a.jpg'); % % Reduce number of pixels by a half. img_half = imgdata(1:2:end,1:2:end,:); % % Reduce number of pixels by a third. img_third = imgdata(1:3:end,1:3:end,:);
Cree un nuevo archivo TIFF construyendo un objeto
Tiff
y especificando el nombre del nuevo archivo como argumento. Para crear un archivo, debe especificar el modo escritura ('w'
) o el modo añadir ('a'
). El constructor deTiff
devuelve un identificador a un objetoTiff
.t = Tiff('my_subimage_file.tif','w');
Establezca las etiquetas de TIFF requeridas usando el método
setTag
del objetoTiff
. Estas etiquetas requeridas especifican información sobre la imagen, como su largo y ancho. Para dividir los datos de la imagen en tiras, especifique un valor para la etiquetaRowsPerStrip
. Para dividir los datos de la imagen en mosaicos, utilice las etiquetasTileWidth
yTileLength
. El ejemplo crea una estructura que contiene nombres y valores de etiquetas y los pasa asetTag
. También puede establecer cada etiqueta individualmente.Para crear subdirectorios, debe establecer la etiqueta
SubIFD
, especificando el número de subdirectorios que desea crear. Tenga en cuenta que el número que especifique no es el valor de la etiquetaSubIFD
. El número indica al software deTiff
que cree unSubIFD
que dirija a dos subdirectorios. El valor real de la etiquetaSubIFD
serán los desplazamientos de bytes de los dos subdirectorios.tagstruct.ImageLength = size(imgdata,1); tagstruct.ImageWidth = size(imgdata,2); tagstruct.Photometric = Tiff.Photometric.RGB; tagstruct.BitsPerSample = 8; tagstruct.SamplesPerPixel = 3; tagstruct.RowsPerStrip = 16; tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct.Software = 'MATLAB'; tagstruct.SubIFD = 2 ; % required to create subdirectories tagstruct % display tagstruct setTag(t,tagstruct)
Para obtener información sobre las etiquetas TIFF compatibles y cómo establecer sus valores, consulte Establecer valores de etiquetas. Por ejemplo, el objeto
Tiff
admite propiedades que puede usar para establecer los valores de ciertas propiedades. Este ejemplo usa la propiedadPlanarConfiguration
del objetoTiff
para especificar el valor correcto de la configuración chunky:Tiff.PlanarConfiguration.Chunky
.Escriba los datos y metadatos de la imagen en el directorio actual usando el método
write
del objetoTiff
.write(t,imgdata);
Configure el primer subdirectorio llamando al método
writeDirectory
. El métodowriteDirectory
configura el subdirectorio y convierte el nuevo directorio en el directorio actual. Como ha especificado que desea crear dos subdirectorios,writeDirectory
configura un subdirectorio.writeDirectory(t);
Establezca las etiquetas requeridas, de la misma forma en que lo hizo en el directorio normal. Según la API de LibTIFF, un subdirectorio no puede contener una etiqueta
SubIFD
.tagstruct2.ImageLength = size(img_half,1); tagstruct2.ImageWidth = size(img_half,2); tagstruct2.Photometric = Tiff.Photometric.RGB; tagstruct2.BitsPerSample = 8; tagstruct2.SamplesPerPixel = 3; tagstruct2.RowsPerStrip = 16; tagstruct2.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct2.Software = 'MATLAB'; tagstruct2 % display tagstruct2 setTag(t,tagstruct2)
Escriba los datos y metadatos de la imagen en el subdirectorio usando el método
write
del objetoTiff
.write(t,img_half);
Configure el segundo subdirectorio llamando al método
writeDirectory
. El métodowriteDirectory
configura el subdirectorio y lo convierte en el directorio actual.writeDirectory(t);
Establezca las etiquetas requeridas, de la misma forma que lo haría en cualquier directorio. Según la API de LibTIFF, un subdirectorio no puede contener una etiqueta
SubIFD
.tagstruct3.ImageLength = size(img_third,1); tagstruct3.ImageWidth = size(img_third,2); tagstruct3.Photometric = Tiff.Photometric.RGB; tagstruct3.BitsPerSample = 8; tagstruct3.SamplesPerPixel = 3; tagstruct3.RowsPerStrip = 16; tagstruct3.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tagstruct3.Software = 'MATLAB'; tagstruct3 % display tagstruct3 setTag(t,tagstruct3)
Escriba los datos y metadatos de la imagen en el subdirectorio usando el método
write
del objetoTiff
:write(t,img_third);
Cierre la conexión con el archivo cerrando el objeto
Tiff
:close(t);
Establecer valores de etiquetas
La siguiente tabla enumera todas las etiquetas TIFF que admite el objeto Tiff
e incluye información sobre su tamaño y clase de MATLAB. En ciertas etiquetas, la tabla también indica el conjunto de valores que admite el objeto Tiff
, que es un subconjunto de todos los valores posibles definidos por la especificación TIFF. Puede usar la estructura de propiedades Tiff
para especificar los valores admitidos en estas etiquetas. Por ejemplo, use Tiff.Compression.JPEG
para especificar la compresión JPEG. Consulte la página de referencia de Tiff para obtener una lista completa de propiedades.
Tabla 1: Etiquetas de TIFF admitidas
Etiqueta de TIFF | Clase | Tamaño | Valores admitidos | Notas |
---|---|---|---|---|
Artist | char | 1xN | ||
BitsPerSample | double | 1x1 | 1,8,16,32,64 | Consulte la Tabla 2 |
ColorMap | double | 256x3 | Los valores deben normalizarse entre 0 y 1. Se almacenan internamente como valores uint16 . | Photometric debe ser Palette |
Compression | double | 1x1 | None : 1CCITTRLE : 2CCITTFax3 : 3CCITTFax4 : 4LZW : 5JPEG : 7CCITTRLEW : 32771PackBits : 32773Deflate : 32946AdobeDeflate : 8 | Consulte la Tabla 3. |
Copyright | char | 1xN | ||
DateTime | char | 1x19 | El valor de retorno se rellena a 19 caracteres si es necesario. | |
DocumentName | char | 1xN | ||
DotRange | double | 1x2 | Photometric debe ser Separated | |
ExtraSamples | double | 1xN | Unspecified : 0AssociatedAlpha : 1UnassociatedAlpha : 2 | Consulte la Tabla 4. |
FillOrder | double | 1x1 | ||
GeoAsciiParamsTag | char | 1xN | ||
GeoDoubleParamsTag | double | 1xN | ||
GeoKeyDirectoryTag | double | Nx4 | ||
Group3Options | double | 1x1 | Compression debe ser CCITTFax3 | |
Group4Options | double | 1x1 | Compression debe ser CCITTFax4 | |
HalfToneHints | double | 1x2 | ||
HostComputer | char | 1xn | ||
ICCProfile | uint8 | 1xn | ||
ImageDescription | char | 1xn | ||
ImageLength | double | 1x1 | ||
ImageWidth | double | 1x1 | ||
InkNames | char cell array | 1x NumInks | Photometric debe ser Separated | |
InkSet | double | 1x1 | CMYK : 1MultiInk : 2 | Photometric debe ser Separated |
JPEGQuality | double | 1x1 | Un valor entre 1 y 100 | |
Make | char | 1xn | ||
MaxSampleValue | double | 1x1 | 0–65,535 | |
MinSampleValue | double | 1x1 | 0–65,535 | |
Model | char | 1xN | ||
ModelPixelScaleTag | double | 1x3 | ||
ModelTiepointTag | double | Nx6 | ||
ModelTransformationMatrixTag | double | 1x16 | ||
NumberOfInks | double | 1x1 | Debe ser igual a SamplesPerPixel | |
Orientation | double | 1x1 | TopLeft : 1TopRight : 2BottomRight : 3BottomLeft : 4LeftTop : 5RightTop : 6RightBottom : 7LeftBottom : 8 | |
PageName | char | 1xN | ||
PageNumber | double | 1x2 | ||
Photometric | double | 1x1 | MinIsWhite : 0MinIsBlack : 1RGB : 2Palette : 3Mask : 4Separated : 5YCbCr : 6CIELab : 8ICCLab : 9ITULab : 10 | Consulte la Tabla 2. |
Photoshop | uint8 | 1xN | ||
PlanarConfiguration | double | 1x1 | Chunky : 1 Separate : 2 | |
PrimaryChromaticities | double | 1x6 | ||
ReferenceBlackWhite | double | 1x6 | ||
ResolutionUnit | double | 1x1 | ||
RICHTIFFIPTC | uint8 | 1xN | ||
RowsPerStrip | double | 1x1 | ||
RPCCoefficientTag | double | 1x92 | Vector fila de 92 elementos | Consulte la Tabla 6 |
SampleFormat | double | 1x1 | Uint : 1Int : 2IEEEFP : 3 | Consulte la Tabla 2 |
SamplesPerPixel | double | 1x1 | ||
SMaxSampleValue | double | 1x1 | Rango de tipo de datos de MATLAB especificado para los datos de imagen | |
SMinSampleValue | double | 1x1 | Rango de tipo de datos de MATLAB especificado para los datos de imagen | |
Software | char | 1xN | ||
StripByteCounts | double | 1xN | Solo lectura | |
StripOffsets | double | 1xN | Solo lectura | |
SubFileType | double | 1x1 | Default : 0ReducedImage : 1Page : 2Mask : 4 | |
SubIFD | double | 1x1 | ||
TargetPrinter | char | 1xN | ||
Thresholding | double | 1x1 | BiLevel : 1 HalfTone : 2 ErrorDiffuse : 3 |
|
TileByteCounts | double | 1xN | Solo lectura | |
TileLength | double | 1x1 | Debe ser un múltiplo de 16 | |
TileOffsets | double | 1xN | Solo lectura | |
TileWidth | double | 1x1 | Debe ser un múltiplo de 16 | |
TransferFunction | double | Consulte la nota1 | Cada valor debe estar dentro de 0–2^16-1 | SamplePerPixel puede ser 1 o 3 |
WhitePoint | double | 1x2 | Photometric puede ser: RGB Palette YCbCr CIELab ICCLab ITULab | |
XMP | char | 1xn | N>5 | |
XPostion | double | 1x1 | ||
XResolution | double | 1x1 | ||
YCbCrCoefficents | double | 1x3 | Photometric debe ser YCbCr | |
YCbCrPositioning | double | 1x1 | Centered : 1 Cosited : 2 | Photometric debe ser YCbCr |
YCbCrSubSampling | double | 1x2 | Photometric debe ser YCbCr | |
YPosition | double | 1x1 | ||
YResolution | double | 1x1 | ||
ZipQuality | double | 1x1 | Valor entre 1 y 9 |
1El tamaño es 1x2^BitsPerSample
o 3x2^BitsPerSample
.
Tabla 2: Valores válidos de SampleFormat para los ajustes de BitsPerSample
BitsPerSample | SampleFormat | Tipo de datos de MATLAB |
---|---|---|
1 | Uint | logical |
8 | Uint , Int | uint8 , int8 |
16 | Uint , Int | uint16 , int16 |
32 | Uint , Int , IEEEFP | uint32 , int32 , single |
64 | IEEEFP | double |
Tabla 3: Valores válidos de SampleFormat para BitsPerSample y combinaciones fotométricas
Valores de BitsPerSample | |||||
---|---|---|---|---|---|
Valores fotométricos | 1 | 8 | 16 | 32 | 64 |
MinIsWhite | Uint | Uint/Int | Uint Int | Uint Int IEEEFP | IEEEFP |
MinIsBlack | Uint | Uint/Int | Uint Int | Uint Int IEEEFP | IEEEFP |
RGB | Uint | Uint | Uint IEEEFP | IEEEFP | |
Pallette | Uint | Uint | |||
Mask | Uint | ||||
Separated | Uint | Uint | Uint IEEEFP | IEEEFP | |
YCbCr | Uint | Uint | Uint IEEEFP | IEEEFP | |
CIELab | Uint | Uint | |||
ICCLab | Uint | Uint | |||
ITULab | Uint | Uint |
Tabla 4: Valores válidos de SampleFormat para BitsPerSample y combinaciones de compresión
Valores de BitsPerSample | |||||
---|---|---|---|---|---|
Valores de compresión | 1 | 8 | 16 | 32 | 64 |
None | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
CCITTRLE | Uint | ||||
CCITTFax3 | Uint | ||||
CCITTFax4 | Uint | ||||
LZW | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
JPEG | Uint Int | ||||
CCITTRLEW | Uint | ||||
PackBits | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
Deflate | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
AdobeDeflate | Uint | Uint Int | Uint Int | Uint Int IEEEFP | IEEEFP |
Tabla 5: Valores válidos de SamplesPerPixel para los ajustes fotométricos
Valores fotométricos | SamplesPerPixel1 |
---|---|
MinIsWhite | 1+ |
MinIsBlack | 1+ |
RGB | 3+ |
Pallette | 1 |
Mask | 1 |
Separated | 1+ |
YCbCr | 3 |
CIELab | 3+ |
ICCLab | 3+ |
ITULab | 3+ |
Tabla 6: Lista de descripciones de valores de RPCCoefficientTag
Valor de índice en el vector de 92 elementos | Descripciones de valores1 | Unidades |
---|---|---|
1 | Error de sesgo de raíz cuadrática de la media | metros por eje horizontal |
2 | Error aleatorio de raíz cuadrática de la media | metros por eje horizontal |
3 | Desviación de línea | píxeles |
4 | Desviación de muestra | píxeles |
5 | Desviación de latitud geodésica | grados |
6 | Desviación de longitud geodésica | grados |
7 | Desviación de altura geodésica | metros |
8 | Factor de escala de línea | píxeles |
9 | Factor de escala de muestra | píxeles |
10 | Escala de latitud geodésica | grados |
11 | Escala de longitud geodésica | grados |
12 | Factor de escala de altura geodésica | metros |
13 a 32 | Coeficientes del numerador de r(n), una ecuación polinomial racional 2 | |
33 a 52 | Coeficientes del denominador de la ecuación polinomial racional r(n) | |
53 a 72 | Coeficientes del numerador de c(n), una ecuación polinomial racional 2 | |
73 a 92 | Coeficientes del denominador de la ecuación polinomial racional c(n) |
1Para especificar los valores en este vector usando el objeto RPCCoefficientTag
, consulte
en la Mapping Toolbox™.RPCCoefficientTag
(Mapping Toolbox)
2Las ecuaciones r(n) y c(n) representan los valores normalizados de fila y columna de un modelo genérico de proyección rigurosa.