Чтобы экспортировать данные из рабочей области MATLAB® с помощью одного из стандартных форматов графических файлов, используйте функцию imwrite
. Используя эту функцию, можно экспортировать данные в форматах, таких как теговый формат графических файлов (TIFF), формат графических данных JPEG (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.
Создайте некоторые данные изображения. Этот пример читает данные изображения из файла JPEG, включенного с MATLAB:
imgdata = imread('ngc6543a.jpg');
Создайте новый файл TIFF путем построения объекта Tiff
, определения имени нового файла в качестве аргумента. Чтобы создать файл, необходимо задать или режим записи ('w'
) или добавить режим ('a'
):
t = Tiff('myfile.tif','w');
Когда вы создаете новый файл TIFF, конструктор Tiff
создает файл, содержащий директорию файла изображения (IFD). Файл TIFF использует эту IFD, чтобы организовать все данные и метаданные, сопоставленные с конкретным изображением. Файл TIFF может содержать несколько IFDs. Объект Tiff
делает IFD, это создает IFD current. методы объекта Tiff
работают с текущей IFD. Можно перейти среди IFDs в файле TIFF и задать, который IFD является текущая IFD с помощью методов объекта Tiff
.
Установите требуемые теги 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
.
Запишите данные изображения и метаданные к текущему каталогу с помощью метода 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+');
Сгенерируйте некоторые данные, чтобы записать в полосу в изображении. Этот пример создает 3D массив нулей, который является размером полосы. Код использует количество строк в полосе, ширине изображения и количестве выборок на пиксель как размерности. Массив является массивом значений 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
. Чтобы повредить данные изображения в мозаики, используйте теги 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
.
Запишите данные изображения и метаданные к текущему каталогу с помощью метода write
объекта Tiff
.
write(t,imgdata);
Настройте первый подкаталог путем вызова метода writeDirectory
. Метод writeDirectory
настраивает подкаталог, и сделайте новую директорию текущим каталогом. Поскольку вы указали, что хотели создать два подкаталога, writeDirectory
настраивает подкаталог.
writeDirectory(t);
Установите требуемые теги, как вы сделали для регулярной директории. Согласно 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)
Запишите данные изображения и метаданные к подкаталогу с помощью метода write
объекта Tiff
.
write(t,img_half);
Настройте второй подкаталог путем вызова метода writeDirectory
. Метод writeDirectory
настраивает подкаталог и делает его текущим каталогом.
writeDirectory(t);
Установите требуемые теги, как вы были бы для любой директории. Согласно 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)
Запишите данные изображения и метаданные к подкаталогу с помощью метода 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 char при необходимости. | |
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 | 1x NumInks | 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 | ||
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 | См. note1 | Каждое значение должно быть в 0 2\U 005E\16 1 | SamplePerPixel может быть или 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 | 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
or3x2^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 | 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 |
Таблица 4: допустимые значения SampleFormat для комбинаций BitsPerSample и сжатия
Значения BitsPerSample | |||||
---|---|---|---|---|---|
Значения сжатия | 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 |
Таблица 5: допустимые значения SamplesPerPixel для светоизмерительных настроек
Фотометрические величины | SamplesPerPixel1 |
---|---|
MinIsWhite | 1+ |
MinIsBlack | 1+ |
RGB | 3+ |
Pallette | 1 |
Mask | 1 |
Separated | 1+ |
YCbCr | 3 |
CIELab | 3+ |
ICCLab | 3+ |
ITULab | 3+ |
1, Когда вы задаете больше, чем ожидаемое количество выборок на пиксель (n+
), необходимо установить тег ExtraSamples
соответственно.