Для экспорта данных из рабочей области MATLAB ® с использованием одного из стандартных форматов графических файлов используйте imwrite функция. С помощью этой функции можно экспортировать данные в таких форматах, как TIFF, JPEG и PNG. Полный список поддерживаемых форматов см. в разделе imwrite справочная страница.
В следующем примере записывается многомерный массив uint8 данные I из рабочей области MATLAB в файл в формате 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.
Пока можно использовать imwrite для экспорта данных изображения и метаданных (тегов) в файлы TIFF, функция имеет некоторые ограничения. Например, если требуется изменить данные изображения или метаданные в файле, необходимо записать все данные в файл. Нельзя записать только обновленную часть. Использование Tiff можно записать части данных изображения и изменить или добавить отдельные теги в файл TIFF. При построении Tiff объект представляет ваше соединение с файлом TIFF и предоставляет доступ ко многим подпрограммам в библиотеке LibTIFF.
В следующих разделах приведены пошаговые примеры использования Tiff методы и свойства объекта для выполнения некоторых общих задач с файлами TIFF. Чтобы получить максимум от Tiff объект, вы должны быть знакомы со спецификацией TIFF и техническими примечаниями. Просмотреть эту документацию по адресу LibTIFF - TIFF Library and Utilities.
Создайте некоторые данные изображения. В этом примере считываются данные изображения из файла JPEG, включенного в MATLAB:
imgdata = imread('ngc6543a.jpg');Создание нового файла TIFF путем создания Tiff , указывая имя нового файла в качестве аргумента. Для создания файла необходимо указать режим записи ('w') или режим добавления ('a'):
t = Tiff('myfile.tif','w');При создании нового файла TIFF Tiff конструктор создает файл, содержащий каталог файлов изображений (IFD). Файл TIFF использует этот IFD для организации всех данных и метаданных, связанных с определенным изображением. Файл TIFF может содержать несколько файлов IFD. Tiff объект создает IFD при создании текущего IFD. Tiff объектные методы работают на текущем ИФД. В TIFF-файле можно осуществлять навигацию между IFD и указать, какой IFD является текущим IFD, используя Tiff объектные методы.
Установите требуемые теги TIFF с помощью setTag способ Tiff объект. Эти требуемые теги определяют информацию об изображении, например его длину и ширину. Чтобы разбить данные изображения на полоски, укажите значение RowsPerStrip тег. Чтобы разбить данные изображения на фрагменты, укажите значения TileWidth и TileLength теги. В примере создается структура, которая содержит имена и значения тегов и передает их в 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 поддерживает свойства, которые можно использовать для задания значений определенных свойств. В этом примере используется Tiff объект PlanarConfiguration для указания правильного значения для конфигурации chunky: Tiff.PlanarConfiguration.Chunky.
Запишите данные изображения и метаданные в текущий каталог с помощью write способ Tiff объект.
write(t,imgdata);
Если вы хотите поместить несколько изображений в свой файл, вызовите writeDirectory метод сразу после выполнения этой операции записи. writeDirectory метод устанавливает новый каталог файлов изображений в файле и делает этот новый каталог текущим каталогом.
Закройте подключение к файлу, закрыв Tiff объект:
close(t);
Проверьте, что вы создали допустимый файл TIFF с помощью imread для чтения файла, а затем отображения изображения:
imagesc(imread('myfile.tif'));Примечание
Изменение полосы или фрагмента данных изображения возможно только в том случае, если данные не сжаты.
Открытие существующего файла TIFF для изменения путем создания Tiff объект. В этом примере используется файл, созданный в разделе Создание нового файла TIFF. Tiff конструктор возвращает дескриптор Tiff объект.
t = Tiff('myfile.tif','r+');Создайте некоторые данные для записи в полоску изображения. В этом примере создается трехмерный массив нулей размером с полосу. Код использует количество строк в полосе, ширину изображения и количество выборок на пиксель в качестве размеров. Массив является массивом uint8 значения.
width = getTag(t,'ImageWidth'); height = getTag(t,'RowsPerStrip'); numSamples = getTag(t,'SamplesPerPixel'); stripData = zeros(height,width,numSamples,'uint8');
Если данные изображения имеют мозаичный макет, следует использовать TileWidth и TileLength для указания размеров.
Запишите данные в полоску в файле с помощью writeEncodedStrip способ. Укажите номер индекса, определяющий полосу, которую требуется изменить. Пример выбирает полоску 18, потому что легче видеть изменение в изображении.
writeEncodedStrip(t,18,stripData);
Если изображение имеет мозаичный макет, следует использовать writeEncodedTile для изменения плитки.
Закройте подключение к файлу, закрыв Tiff объект.
close(t);
Проверьте, что вы изменили полоску изображения в файле TIFF с помощью imread для чтения файла, а затем отображения изображения.
modified_imgdata = imread('myfile.tif');
imagesc(modified_imgdata)Обратите внимание на черную полосу в середине изображения.
Откройте существующий файл TIFF для изменения с помощью Tiff объект. В этом примере используется файл, созданный в разделе Создание нового файла TIFF. Tiff конструктор возвращает дескриптор Tiff объект.
t = Tiff('myfile.tif','r+');Убедитесь, что файл не содержит Artist тег, с использованием getTag способ. Этот код должен содержать сообщение об ошибке, указывающее, что не удалось получить тег.
artist_value = getTag(t,'Artist');
Добавить Artist тег с использованием setTag способ.
setTag(t,'Artist','Pablo Picasso');
Запишите новые данные тега в файл TIFF с помощью rewriteDirectory способ. Используйте rewriteDirectory при изменении существующих метаданных в файле или добавлении новых метаданных в файл.
rewriteDirectory(t);
Закройте подключение к файлу, закрыв Tiff объект.
close(t);
Проверьте свою работу, повторно открыв файл TIFF и получив значение Artist тег, с использованием getTag способ.
t = Tiff('myfile.tif', 'r');
getTag(t,'Artist')
ans =
Pablo Picasso
close(t);Создайте некоторые данные изображения. В этом примере данные изображения считываются из файла 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,:);Создание нового файла TIFF путем создания Tiff и указание имени нового файла в качестве аргумента. Для создания файла необходимо указать режим записи ('w') или режим добавления ('a'). Tiff конструктор возвращает дескриптор Tiff объект.
t = Tiff('my_subimage_file.tif','w');Установите требуемые теги TIFF с помощью setTag способ Tiff объект. Эти требуемые теги определяют информацию об изображении, например его длину и ширину. Чтобы разбить данные изображения на полоски, укажите значение RowsPerStrip тег. Чтобы разбить данные изображения на фрагменты, используйте TileWidth и TileLength теги. В примере создается структура, которая содержит имена и значения тегов и передает их в 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 поддерживает свойства, которые можно использовать для задания значений определенных свойств. В этом примере используется Tiff объект PlanarConfiguration для указания правильного значения для конфигурации chunky: Tiff.PlanarConfiguration.Chunky.
Запишите данные изображения и метаданные в текущий каталог с помощью write способ Tiff объект.
write(t,imgdata);
Настройка первого подкаталога путем вызова writeDirectory способ. writeDirectory метод устанавливает подкаталоги и делает новый каталог текущим каталогом. Поскольку было указано, что требуется создать два подкаталога, writeDirectory устанавливает подкаталоги.
writeDirectory(t);
Установите требуемые теги, как и для обычного каталога. Согласно API LibTIFF, подкаталоги не могут содержать 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)
Запишите данные изображения и метаданные во вложенный каталог с помощью write способ Tiff объект.
write(t,img_half);
Настройка второго подкаталога путем вызова writeDirectory способ. writeDirectory метод устанавливает подкаталога и делает его текущим каталогом.
writeDirectory(t);
Установите требуемые теги, как и для любого каталога. Согласно API LibTIFF, подкаталоги не могут содержать 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)
Запишите данные изображения и метаданные во вложенный каталог с помощью write способ Tiff объект:
write(t,img_third);
Закройте подключение к файлу, закрыв Tiff объект:
close(t);
В следующей таблице перечислены все теги TIFF, Tiff объект поддерживает и включает информацию об их классе и размере MATLAB. Для определенных тегов в таблице также указывается набор значений, Tiff поддерживает объект, который является подмножеством всех возможных значений, определенных спецификацией TIFF. Вы можете использовать Tiff для указания поддерживаемых значений для этих тегов. Например, использовать Tiff.Compression.JPEG для указания сжатия JPEG. Полный список свойств см. на справочной странице Tiff.
Таблица 1: Поддерживаемые теги TIFF
| Тег TIFF | Класс | Размер | Поддерживаемые значения | Примечания |
|---|---|---|---|---|
Artist | char | 1xN | ||
BitsPerSample | double | 1x1 | 1,8,16,32,64 | См. таблицу 2 |
ColorMap | double | 256x3 | Значения должны нормализоваться между 0-1. Хранится внутри как uint16 значения. | Photometric должно быть Palette |
Compression | double | 1x1 | None: 1CCITTRLE: 2CCITTFax3: 3CCITTFax4: 4LZW: 5JPEG: 7CCITTRLEW: 32771PackBits: 32773Deflate: 32946AdobeDeflate: 8 | См. таблицу 3. |
Copyright | char | 1xN | ||
DateTime | char | 1x19 | При необходимости возвращаемое значение дополняется 19 символами. | |
DocumentName | char | 1xN | ||
DotRange | double | 1x2 | Photometric должно быть Separated | |
ExtraSamples | double | 1xN | Unspecified: 0AssociatedAlpha: 1UnassociatedAlpha: 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 | ||
ICCProfile | uint8 | 1xn | ||
ImageDescription | char | 1xn | ||
ImageLength | double | 1x1 | ||
ImageWidth | double | 1x1 | ||
InkNames | char cell array | 1xNumInks | Photometric должно быть Separated | |
InkSet | double | 1x1 | CMYK: 1MultiInk: 2 | Photometric должно быть Separated |
JPEGQuality | double | 1x1 | Значение от 1 до 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 | Должно быть равно 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 | См. таблицу 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 | 92-элементный вектор строки | См. таблицу 6 |
SampleFormat | double | 1x1 | Uint: 1Int: 2IEEEFP: 3 | См. таблицу 2 |
SamplesPerPixel | double | 1x1 | ||
SMaxSampleValue | double | 1x1 | Диапазон типа данных MATLAB, указанный для данных изображения | |
SMinSampleValue | double | 1x1 | Диапазон типа данных MATLAB, указанный для данных изображения | |
Software | char | 1xN | ||
StripByteCounts | double | 1xN | Только для чтения | |
StripOffsets | double | 1xN | Только для чтения | |
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 | Только для чтения | |
TileLength | double | 1x1 | Должно быть кратно 16 | |
TileOffsets | double | 1xN | Только для чтения | |
TileWidth | double | 1x1 | Должно быть кратно 16 | |
TransferFunction | double | См. заметку 1 | Каждое значение должно находиться в пределах 0-2 ^ 16-1 | SamplePerPixel может быть либо 1, либо 3 |
WhitePoint | double | 1x2 | Photometric могут быть: RGBPalette YCbCrCIELabICCLabITULab | |
XMP | char | 1xn | N>5 | |
XPostion | double | 1x1 | ||
XResolution | double | 1x1 | ||
YCbCrCoefficents | double | 1x3 | Photometric должно быть YCbCr | |
YCbCrPositioning | double | 1x1 | Centered: 1 Cosited: 2 | Photometric должно быть YCbCr |
YCbCrSubSampling | double | 1x2 | Photometric должно быть YCbCr | |
YPosition | double | 1x1 | ||
YResolution | double | 1x1 | ||
ZipQuality | double | 1x1 | Значение от 1 до 9 |
1Size является 1x2^BitsPerSample или3x2^BitsPerSample.
Таблица 2: Допустимые значения SampleFormat для параметров BitsPerSample
| BitsPerSample | SampleFormat | Тип данных MATLAB |
|---|---|---|
| 1 | Uint | logical |
| 8 | Uint, Int | uint8, int8 |
| 16 | Uint, Int | uint16, int16 |
| 32 | Uint, Int, IEEEFP | uint32, int32, single |
| 64 | IEEEFP | double |
Таблица 3: Допустимые значения формата SampleFormat для BitsPerSample и фотометрических комбинаций
| Значения BitsPerSample | |||||
|---|---|---|---|---|---|
| Фотометрические значения | 1 | 8 | 16 | 32 | 64 |
MinIsWhite | Uint | Uint/Int | UintInt | UintInt IEEEFP | IEEEFP |
MinIsBlack | Uint | Uint/Int | UintInt | UintInt IEEEFP | IEEEFP |
RGB | Uint | Uint | UintIEEEFP | IEEEFP | |
Pallette | Uint | Uint | |||
Mask | Uint | ||||
Separated | Uint | Uint | UintIEEEFP | IEEEFP | |
YCbCr | Uint | Uint | UintIEEEFP | IEEEFP | |
CIELab | Uint | Uint | |||
ICCLab | Uint | Uint | |||
ITULab | Uint | Uint | |||
Таблица 4: Допустимые значения SampleFormat для комбинаций BitsPerSample и Compression
| Значения BitsPerSample | |||||
|---|---|---|---|---|---|
| Значения сжатия | 1 | 8 | 16 | 32 | 64 |
None | Uint | UintInt | UintInt | UintInt IEEEFP | IEEEFP |
CCITTRLE | Uint | ||||
CCITTFax3 | Uint | ||||
CCITTFax4 | Uint | ||||
LZW | Uint | UintInt | UintInt | UintInt IEEEFP | IEEEFP |
JPEG | UintInt | ||||
CCITTRLEW | Uint | ||||
PackBits | Uint | UintInt | UintInt | UintInt IEEEFP | IEEEFP |
Deflate | Uint | UintInt | UintInt | UintInt IEEEFP | IEEEFP |
AdobeDeflate | Uint | UintInt | UintInt | UintInt IEEEFP | IEEEFP |
Таблица 5: Допустимые значения PerPixel для фотометрических настроек
| Фотометрические значения | SamplesPerPixel1 |
|---|---|
MinIsWhite | 1+ |
MinIsBlack | 1+ |
RGB | 3+ |
Pallette | 1 |
Mask | 1 |
Separated | 1+ |
YCbCr | 3 |
CIELab | 3+ |
ICCLab | 3+ |
ITULab | 3+ |
Таблица 6: список описаний стоимости RPCCoefficientTag
| Значение индекса в векторе 92-Element | Descriptions1 стоимости | Единицы |
|---|---|---|
| 1 | Среднеквадратическая ошибка смещения | метров на горизонтальную ось |
| 2 | Среднеквадратическая случайная ошибка | метров на горизонтальную ось |
| 3 | Смещение линии | пиксели |
| 4 | Смещение образца | пиксели |
| 5 | Смещение геодезической широты | степени |
| 6 | Смещение геодезической долготы | степени |
| 7 | Смещение геодезической высоты | метры |
| 8 | Масштабный коэффициент линии | пиксели |
| 9 | Коэффициент масштаба образца | пиксели |
| 10 | Шкала геодезической широты | степени |
| 11 | Шкала геодезической долготы | степени |
| 12 | Коэффициент шкалы геодезической высоты | метры |
| 13 через 32 | Числительные коэффициенты r (n), рациональное полиномиальное уравнение 2 | |
| 33 через 52 | Коэффициенты знаменателя рационального полиномиального уравнения r (n) | |
| 53 через 72 | Числительные коэффициенты c (n), рациональное полиномиальное уравнение 2 | |
| 73 через 92 | Коэффициенты знаменателя рационального полиномиального уравнения c (n) |
1To задать значения в этом векторе с помощью RPCCoefficientTag объект, см. в Toolbox™ Сопоставление.RPCCoefficientTag (Mapping Toolbox)
2Equations r (n) и c (n) представляют нормализованные значения строк и столбцов общей модели строгой проекции.