Экспорт в изображения

Чтобы экспортировать данные из рабочей области MATLAB® с помощью одного из стандартных форматов графических файлов, используйте функцию imwrite. Используя эту функцию, можно экспортировать данные в форматах, таких как теговый формат графических файлов (TIFF), формат графических данных JPEG (JPEG) и Переносимая сетевая графика (PNG). Для полного списка поддерживаемых форматов смотрите страницу с описанием imwrite.

Следующий пример пишет многомерный массив данных uint8 I от MATLAB workspace в файл в формате TIFF. Класс выходного изображения, записанного в файл, зависит от заданного формата. Для большинства форматов, если входной массив имеет класс uint8, imwrite выходные параметры данные как 8-битные значения. Смотрите страницу с описанием imwrite для деталей.

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');

Примечание

imwrite поддерживает различные синтаксисы для нескольких из стандартных форматов. Например, с форматом файла TIFF, можно задать тип сжатия использование MATLAB, чтобы сохранить изображение. Смотрите страницу с описанием imwrite для деталей.

Для большего количества управления, записывающего данные к файлу TIFF, используйте объект Tiff — смотрите Данные изображения Экспорта и Метаданные к файлам TIFF для получения дополнительной информации.

Экспорт изображений и метаданных в файлы TIFF

В то время как можно использовать imwrite для данных изображения экспорта и метаданных (теги) к файлам тегового формата графических файлов (TIFF), функция действительно имеет некоторые ограничения. Например, когда это необходимо чтобы изменить данные изображения или метаданные в файле, необходимо записать все данные в файл. Вы не можете только для записи обновленный фрагмент. Используя объект Tiff, можно записать фрагменты данных изображения и изменить или добавить отдельные теги к файлу TIFF. Когда вы создаете объект Tiff, он представляет вашу связь с файлом TIFF и обеспечивает доступ ко многим стандартным программам в библиотеке LibTIFF.

Следующие разделы обеспечивают постепенные примеры использования методов объекта Tiff и свойств выполнить некоторые общие задачи с файлами TIFF. Чтобы получить все возможное от объекта Tiff, необходимо быть знакомы со спецификацией TIFF и техническими примечаниями. Смотрите эту документацию в наборе библиотек и утилит LibTIFF — TIFF.

Создание нового файла TIFF

  1. Создайте некоторые данные изображения. Этот пример читает данные изображения из файла JPEG, включенного с MATLAB:

    imgdata = imread('ngc6543a.jpg');
  2. Создайте новый файл TIFF путем построения объекта Tiff, определения имени нового файла в качестве аргумента. Чтобы создать файл, необходимо задать или режим записи ('w') или добавить режим ('a'):

    t = Tiff('myfile.tif','w');

    Когда вы создаете новый файл TIFF, конструктор Tiff создает файл, содержащий директорию файла изображения (IFD). Файл TIFF использует эту IFD, чтобы организовать все данные и метаданные, сопоставленные с конкретным изображением. Файл TIFF может содержать несколько IFDs. Объект Tiff делает IFD, это создает текущую IFD. методы объекта Tiff работают с текущей IFD. Можно перейти среди IFDs в файле TIFF и задать, который IFD является текущая IFD с помощью методов объекта Tiff.

  3. Установите требуемые теги TIFF с помощью метода setTag объекта Tiff. Эти необходимые теги задают информацию об изображении, таком как его длина и ширина. Чтобы повредить данные изображения в полосы, задайте значение для тега RowsPerStrip. Чтобы повредить данные изображения в мозаики, задайте значения для тегов TileLength и TileWidth. Пример создает структуру, которая содержит имена тега и значения и передачи это к setTag. Также можно установить каждый тег индивидуально.

    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)

    Для получения информации о поддерживаемых тегах TIFF и как установить их значения, смотрите Устанавливающие Значения Тега. Например, свойства поддержки объектов Tiff, которые можно использовать, чтобы установить значения определенных свойств. Этот пример использует свойство PlanarConfiguration объекта Tiff задать правильное значение для короткой настройки: Tiff.PlanarConfiguration.Chunky.

  4. Запишите данные изображения и метаданные к текущему каталогу с помощью метода write объекта Tiff.

    write(t,imgdata);
    

    Если вы хотели поместить повторные изображения в свой файл, вызовите метод writeDirectory прямо после выполнения этой операции записи. Метод writeDirectory настраивает новую директорию файла изображения в файле и делает эту новую директорию текущим каталогом.

  5. Закройте свою связь с файлом путем закрытия объекта Tiff:

    close(t);
    
  6. Протестируйте это, вы создали допустимый файл TIFF при помощи функции imread, чтобы считать файл, и затем отобразить изображение:

    imagesc(imread('myfile.tif'));

Запись полосы или мозаики данных изображения

Примечание

Можно только изменить полосу или мозаику данных изображения, если данные не сжаты.

  1. Откройте существующий файл TIFF для модификации путем создания объекта Tiff. Этот пример использует файл, созданный в Создании Нового файла TIFF. Конструктор Tiff возвращает указатель на объект Tiff.

    t = Tiff('myfile.tif','r+');
  2. Сгенерируйте некоторые данные, чтобы записать в полосу в изображении. Этот пример создает трехмерный массив нулей, который является размером полосы. Код использует количество строк в полосе, ширине изображения и количестве выборок на пиксель как размерности. Массив является массивом значений uint8.

    width = getTag(t,'ImageWidth');
    height = getTag(t,'RowsPerStrip');
    numSamples = getTag(t,'SamplesPerPixel');
    stripData = zeros(height,width,numSamples,'uint8');
    

    Если бы данные изображения имели мозаичное размещение, вы использовали бы TileWidth и теги TileLength, чтобы задать размерности.

  3. Запишите данные в полосу в файле с помощью метода writeEncodedStrip. Задайте индекс, который идентифицирует полосу, которую вы хотите изменить. Выборы в качестве примера разделяют 18, потому что легче видеть изменение в изображении.

    writeEncodedStrip(t,18,stripData);
    

    Если бы изображение имело мозаичное размещение, вы использовали бы метод writeEncodedTile, чтобы изменить мозаику.

  4. Закройте свою связь с файлом путем закрытия объекта Tiff.

    close(t);
    
  5. Протестируйте это, вы изменили полосу изображения в файле TIFF при помощи функции imread, чтобы считать файл, и затем отобразить изображение.

    modified_imgdata = imread('myfile.tif');
    imagesc(modified_imgdata)

    Отметьте черную полосу через середину изображения.

Изменение метаданных файла TIFF (теги)

  1. Откройте существующий файл TIFF для модификации с помощью объекта Tiff. Этот пример использует файл, созданный в Создании Нового файла TIFF. Конструктор Tiff возвращает указатель на объект Tiff.

    t = Tiff('myfile.tif','r+');
  2. Проверьте, что файл не содержит тег Artist, с помощью метода getTag. Этот код должен выдать ошибку сообщение, говоря, что это не могло получить тег.

    artist_value = getTag(t,'Artist');
  3. Добавьте тег Artist с помощью метода setTag.

    setTag(t,'Artist','Pablo Picasso');
  4. Запишите новые данные тега в файл TIFF с помощью метода rewriteDirectory. Используйте метод rewriteDirectory при изменении существующих метаданных в файле или добавлении новых метаданных к файлу.

    rewriteDirectory(t);
  5. Закройте свою связь с файлом путем закрытия объекта Tiff.

    close(t);
    
  6. Протестируйте свою работу путем повторного открытия файла TIFF и получения значения тега Artist, использования метода getTag.

    t = Tiff('myfile.tif', 'r');
    
    getTag(t,'Artist')
    
    ans =
    
    Pablo Picasso
    
    close(t);

Создание подкаталогов файла TIFF

  1. Создайте некоторые данные изображения. Этот пример читает данные изображения из файла JPEG, включенного с MATLAB. Пример затем создает два уменьшенных разрешения (миниатюра) версии данных изображения.

    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,:);
  2. Создайте новый файл TIFF путем построения объекта Tiff и определения имени нового файла в качестве аргумента. Чтобы создать файл, необходимо задать или режим записи ('w') или добавить режим ('a'). Конструктор Tiff возвращает указатель на объект Tiff.

    t = Tiff('my_subimage_file.tif','w');
  3. Установите требуемые теги TIFF с помощью метода setTag объекта Tiff. Эти необходимые теги задают информацию об изображении, таком как его длина и ширина. Чтобы повредить данные изображения в полосы, задайте значение для тега RowsPerStrip. Чтобы повредить данные изображения в мозаики, используйте теги TileLength и TileWidth. Пример создает структуру, которая содержит имена тега и значения и передачи это к setTag. Можно также установить каждый тег индивидуально.

    Чтобы создать подкаталоги, необходимо установить тег SubIFD, задав количество подкаталогов, которые вы хотите создать. Обратите внимание на то, что номер, который вы задаете, не является значением тега SubIFD. Номер говорит программному обеспечению Tiff создавать SubIFD, который указывает на два подкаталога. Фактическое значение тега SubIFD будет байтовыми смещениями этих двух подкаталогов.

    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)

    Для получения информации о поддерживаемых тегах TIFF и как установить их значения, смотрите Устанавливающие Значения Тега. Например, свойства поддержки объектов Tiff, которые можно использовать, чтобы установить значения определенных свойств. Этот пример использует свойство PlanarConfiguration объекта Tiff задать правильное значение для короткой настройки: Tiff.PlanarConfiguration.Chunky.

  4. Запишите данные изображения и метаданные к текущему каталогу с помощью метода write объекта Tiff.

    write(t,imgdata);
    
  5. Настройте первый подкаталог путем вызова метода writeDirectory. Метод writeDirectory настраивает подкаталог, и сделайте новую директорию текущим каталогом. Поскольку вы указали, что хотели создать два подкаталога, writeDirectory настраивает подкаталог.

    writeDirectory(t);
    
  6. Установите требуемые теги, как вы сделали для регулярной директории. Согласно LibTIFF API, подкаталог не может содержать тег 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)
  7. Запишите данные изображения и метаданные к подкаталогу с помощью метода write объекта Tiff.

    write(t,img_half);
    
  8. Настройте второй подкаталог путем вызова метода writeDirectory. Метод writeDirectory настраивает подкаталог и делает его текущим каталогом.

    writeDirectory(t);
    
  9. Установите требуемые теги, как вы были бы для любой директории. Согласно LibTIFF API, подкаталог не может содержать тег 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)
  10. Запишите данные изображения и метаданные к подкаталогу с помощью метода write объекта Tiff:

    write(t,img_third);
    
  11. Закройте свою связь с файлом путем закрытия объекта Tiff:

    close(t);
    

Устанавливание значений тега

В следующей таблице перечислены все теги TIFF, что поддержка объектов Tiff и включает информацию о своем классе MATLAB и размере. Для определенных тегов таблица также показывает множество значений, что поддержка объектов Tiff, который является подмножеством всех возможных значений, заданных спецификацией TIFF. Можно использовать структуру свойств Tiff, чтобы задать поддерживаемые значения для этих тегов. Например, используйте Tiff.Compression.JPEG, чтобы задать сжатие JPEG. Смотрите страницу с описанием Tiff для полного списка свойств.

Таблица 1: поддерживаемые теги TIFF

Тег TIFFКлассРазмерПоддерживаемые значенияПримечания
Artist'char'1xN  
'BitsPerSample' 'double'1x11,8,16,32,64См. таблицу 2
Палитра'double'256x3Значения должны быть нормализованы между 0–1. Сохраненный внутренне как значения uint16.Photometric должен быть Palette
Сжатие'double'1x1'none': 1
CCITTRLE: 2
CCITTFax3: 3
CCITTFax4: 4
LZW: 5
JPEG: 7
CCITTRLEW: 32771
PackBits: 32773
Deflate: 32946
AdobeDeflate: 8
См. таблицу 3.
\copyright'char' 1xN  
Datetime'char'1x19Возвращаемое значение дополнено к 19 char при необходимости. 
DocumentName'char'1xN  
DotRange'double'1x2 Photometric должен быть Separated
ExtraSamples'double'1xNUnspecified: 0
AssociatedAlpha: 1
UnassociatedAlpha: 2
См. таблицу 4.
FillOrder'double'1x1  
GeoAsciiParamsTag'char'1xN  
GeoDoubleParamsTag'double'1xN  
GeoKeyDirectoryTag'double'Nx4  
Group3Options'double'1x1 Compression должен быть CCITTFax3
Group4Options'double'1x1 Compression должен быть CCITTFax4
HalfToneHints'double'1x2  
HostComputer'char'1xn  
ICCProfileuint81xn  
ImageDescription'char'1xn  
ImageLength'double'1x1  
ImageWidth'double'1x1  
InkNameschar cell array1x
NumInks
 Photometric должен быть Separated
InkSet'double' 1x1CMYK: 1
MultiInk: 2
Photometric должен быть Separated
JPEGQuality'double'1x1Значение между 1 и 100 
Make'char' 1xn  
MaxSampleValue'double'1x10-65 535 
MinSampleValue'double'1x10-65 535 
Model'char'1xN  
ModelPixelScaleTag'double'1x3  
ModelTiepointTag'double'Nx6  
ModelTransformationMatrixTag'double'1x16  
NumberOfInks'double'1x1 Должно быть равно SamplesPerPixel
Orientation'double'1x1TopLeft: 1
TopRight: 2
BottomRight: 3
BottomLeft: 4
LeftTop: 5
RightTop: 6
RightBottom: 7
LeftBottom: 8
 
PageName'char'1xN  
PageNumber'double'1x2  
Photometric'double'1x1MinIsWhite: 0
MinIsBlack: 1
Rgb : 2
Palette: 3
Mask: 4
Separated: 5
YCbCr: 6
CIELab: 8
ICCLab: 9
ITULab: 10
См. таблицу 2.
Photoshopuint8 1xN  
PlanarConfiguration'double'1x1Chunky: 1
Separate: 2
 
PrimaryChromaticities'double'1x6  
ReferenceBlackWhite'double'1x6  
'ResolutionUnit' 'double' 1x1  
RICHTIFFIPTCuint81xN  
'RowsPerStrip' 'double'1x1  
SampleFormat'double'1x1Uint: 1
Int: 2
IEEEFP: 3
См. таблицу 2
SamplesPerPixel'double'1x1  
SMaxSampleValue'double'1x1Область значений типа данных MATLAB задана для Данных изображения  
SMinSampleValue'double'1x1Область значений типа данных MATLAB задана для Данных изображения  
Software'char'1xN  
StripByteCounts'double'1xN Только для чтения
StripOffsets'double'1xN Только для чтения
SubFileType'double'1x1Default: 0
ReducedImage: 1
Page: 2
Mask: 4
 
SubIFD'double'1x1  
TargetPrinter'char'1xN  
Thresholding'double'1x1BiLevel: 1
HalfTone: 2
ErrorDiffuse: 3

Photometric может быть также: MinIsWhite MinIsBlack

TileByteCounts'double'1xN Только для чтения
TileLength'double'1x1Должен быть кратным 16 
TileOffsets'double'1xN Только для чтения
TileWidth'double'1x1Должен быть кратным 16 
Передаточная функция'double'См. note1Каждое значение должно быть в 0 2\U 005E\16 1SamplePerPixel может быть или 1 или 3
WhitePoint'double'1x2 Photometric может быть: Rgb
Palette
YCbCr
CIELab
ICCLab
ITULab
XMP'char'1xn N>5
XPostion'double'1x1  
'XResolution' 'double'1x1  
YCbCrCoefficents'double'1x3 Photometric должен быть YCbCr
YCbCrPositioning'double'1x1Centered: 1
Cosited: 2
Photometric должен быть YCbCr
YCbCrSubSampling'double'1x2 Photometric должен быть YCbCr
YPosition'double'1x1  
'YResolution' 'double'1x1  
ZipQuality'double'1x1Значение между 1 и 9 

1Size 1x2^BitsPerSample or3x2^BitsPerSample.

Таблица 2: допустимые значения SampleFormat для настроек BitsPerSample

'BitsPerSample' SampleFormatТип данных MATLAB
1Uintлогический
8Uint, Intuint8, int8
16Uint, Intuint16, int16
32Uint, Int, IEEEFPuint32, int32, single
64IEEEFP'double'

Таблица 3: допустимые значения SampleFormat для BitsPerSample и светоизмерительных комбинаций

 Значения BitsPerSample
Фотометрические величины18163264
MinIsWhite UintUint/IntUint
Int
Uint
Int
IEEEFP
IEEEFP
MinIsBlack UintUint/IntUint
Int
Uint
Int
IEEEFP
IEEEFP
Rgb  UintUintUint
IEEEFP
IEEEFP
Pallette UintUint  
Mask Uint    
Separated  UintUintUint
IEEEFP
IEEEFP
YCbCr  UintUintUint
IEEEFP
IEEEFP
CIELab  UintUint  
ICCLab  UintUint  
ITULab  UintUint  

Таблица 4: допустимые значения SampleFormat для комбинаций BitsPerSample и сжатия

 Значения BitsPerSample
Значения сжатия18163264
'none'UintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
CCITTRLEUint    
CCITTFax3Uint    
CCITTFax4Uint    
LZWUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
JPEG Uint
Int
   
CCITTRLEWUint    
PackBitsUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
DeflateUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP
AdobeDeflateUintUint
Int
Uint
Int
Uint
Int
IEEEFP
IEEEFP

Таблица 5: допустимые значения SamplesPerPixel для светоизмерительных настроек

Фотометрические величиныSamplesPerPixel1
MinIsWhite 1+
MinIsBlack 1+
Rgb 3+
Pallette1
Mask 1
Separated 1+
YCbCr 3
CIELab 3+
ICCLab 3+
ITULab 3+

1, Когда вы задаете больше, чем ожидаемое количество выборок на пиксель (n+), необходимо установить тег ExtraSamples соответственно.

Смотрите также

Внешние веб-сайты

Была ли эта тема полезной?