В дополнение к чтению TIFF или файлов JPEG2000 и записи файлов TIFF, blockproc
функция может считать и записать другие форматы. Чтобы работать с данными изображения в другом формате файла, необходимо создать класс, который наследовался ImageAdapter
класс. ImageAdapter
класс является абстрактным классом, который является частью программного обеспечения Image Processing Toolbox™. Это задает подпись для методов что blockproc
использование для файлового ввода-вывода с изображениями на диске. Можно сопоставить экземпляры класса Адаптера Изображений с файлом и использовать их в качестве аргументов к blockproc
для основанной на файле обработки блока.
Этот раздел демонстрирует процесс записи класса Адаптера Изображений путем обсуждения класса в качестве примера (LanAdapter
класс. LanAdapter
класс является частью тулбокса. Используйте этот простой, класс только для чтения, чтобы обработать произвольно большой uint8
Файлы LAN с blockproc
.
Понять как LanAdapter
класс работает, необходимо сначала знать о формате файла LAN. Landsat тематическое формирование изображений картопостроителя хранится в формате файла LAN Эрдаса. Файлы LAN Эрдаса содержат 128-байтовый заголовок, сопровождаемый одним или несколькими диапазонами данных, разделенных по строкам (BIL), в порядке увеличения числа полосы. Данные хранятся в прямом порядке байтов. Заголовок содержит несколько частей важной информации о файле, включая размер, тип данных и количество полос формирования изображений, содержавшегося в файле. Спецификация формата файла LAN задает первые 24 байта заголовка файла как показано в таблице.
Содержимое заголовка файла
Байты | Тип данных | Содержимое |
---|---|---|
1–6 | 6 массивов байтов символов, которые идентифицируют версию формата файла | 'HEADER' или 'HEAD74' (Пред7.4 файлов говорят 'HEADER' .) |
7–8 | 16-битное целое число | Упакуйте тип файла (глубина индикаторного разряда) |
9–10 | 16-битное целое число | Количество полос данных |
11–16 | 6 байтов | Неиспользованный |
17–20 | 32-битное целое число | Количество столбцов данных |
21–24 | 32-битное целое число | Количество строк данных |
Остающиеся 104 байта содержат различные другие свойства файла, который не использует этот пример.
Как правило, при работе с файлами LAN, первый шаг должен узнать больше о файле путем парсинга заголовка. Следующий код показывает, как проанализировать заголовок rio.lan
файл:
Откройте файл:
file_name = 'rio.lan'; fid = fopen(file_name,'r');
Считайте первые шесть байтов заголовка:
headword = fread(fid,6,'uint8=>char')'; fprintf('Version ID: %s\n',headword);
Считайте тип пакета:
pack_type = fread(fid,1,'uint16',0,'ieee-le'); fprintf('Pack Type: %d\n',pack_type);
Считайте количество диапазонов:
num_bands = fread(fid,1,'uint16',0,'ieee-le'); fprintf('Number of Bands: %d\n',num_bands);
Считайте ширину изображения и высоту:
unused_bytes = fread(fid,6,'uint8',0,'ieee-le'); width = fread(fid,1,'uint32',0,'ieee-le'); height = fread(fid,1,'uint32',0,'ieee-le'); fprintf('Image Size (w x h): %d x %d\n',width,height);
Закройте файл:
fclose(fid);
Выход появляется следующим:
Version ID: HEAD74 Pack Type: 0 Number of Bands: 7 Image Size (w x h): 512 x 512
rio.lan
файл 512 512, изображение с 7 полосами. Тип пакета 0 указывает, что каждая выборка является 8-битным, беззнаковым целым (uint8
тип данных.
В типичном, рабочем процессе в оперативной памяти вы считали бы этот файл LAN с помощью multibandread
функция. Формат LAN хранит данные о RGB от видимого спектра в полосах 3, 2, и 1, соответственно. Вы могли создать изображение истинного цвета для последующей обработки.
truecolor = multibandread('rio.lan', [512, 512, 7],... 'uint8=>uint8', 128,'bil', 'ieee-le', {'Band','Direct',[3 2 1]});
Для очень больших файлов LAN, однако, читая и обрабатывая целое изображение в памяти с помощью multibandread
может быть непрактичным, в зависимости от ваших системных возможностей. Чтобы избежать ограничений памяти, используйте blockproc
функция. С blockproc
, можно обработать изображения с основанным на файле рабочим процессом. Можно считать, обработать, и затем записать результаты, один блок за один раз.
blockproc
функционируйте только поддерживает чтение и запись определенных форматов файлов, но это расширяемо через ImageAdapter
класс. Чтобы записать класс Адаптера Изображений для конкретного формата файла, необходимо смочь:
Запросите размер файла на диске
Считайте прямоугольный блок данных из файла
Если вы удовлетворяете этим двум условиям, можно записать класс Адаптера Изображений для файлов LAN. Можно проанализировать заголовок изображений, чтобы запросить размер файла, и можно изменить вызов multibandread
считать конкретный блок данных. Можно инкапсулировать код для этих двух целей в структуре класса Адаптера Изображений, и затем работать непосредственно с большими файлами LAN с blockproc
функция. LanAdapter
класс является классом Адаптера Изображений для файлов LAN и является частью программного обеспечения Image Processing Toolbox.
В этом разделе описываются конструктора, свойства и методы LanAdapter
класс. Изучение LanAdapter
класс помогает подготовить вас к записи вашего собственного класса Адаптера Изображений. Если вы плохо знакомы с объектно-ориентированным программированием, смотрите Классы Разработки — Типичный Рабочий процесс для получения общей информации о записи классов.
Открытый LanAdapter.m
и посмотрите на реализацию LanAdapter
класс.
LanAdapter
класс начинается с ключевого слова classdef
. classdef
раздел задает имя класса и указывает на тот LanAdapter
наследовался ImageAdapter
суперкласс. Наследование от ImageAdapter
позволяет новый класс:
Взаимодействуйте с blockproc
Задайте общий ImageAdapter
свойства
Задайте интерфейс что blockproc
использование, чтобы читать и записать в файлы LAN
После classdef
разделите, LanAdapter
класс содержит два блока свойств класса. Первый блок содержит свойства, которые публично отображаются, но не публично модифицируемые. Второй блок содержит полностью публичные свойства. LanAdapter
класс хранит некоторую информацию из заголовка файла как свойства класса. Другие классы, которые также наследовались ImageAdapter
, но та поддержка различные форматы файлов, может иметь различные свойства.
classdef LanAdapter < ImageAdapter properties(GetAccess = public, SetAccess = private) Filename NumBands end properties(Access = public) SelectedBands end
В дополнение к свойствам, заданным в LanAdapter.m
, класс наследовал ImageSize
свойство от ImageAdapter
суперкласс. Новый класс устанавливает ImageSize
свойство в конструкторе.
Конструктор класса инициализирует LanAdapter
объект. LanAdapter
конструктор анализирует информацию о заголовке файла LAN и устанавливает свойства класса. Реализуйте конструктора, метод класса, в methods
блок.
Конструктор содержит большую часть того же кода, используемого, чтобы проанализировать заголовок файла LAN. LanAdapter
класс только поддерживает uint8
файлы типа данных, таким образом, конструктор подтверждает тип пакета файла LAN, а также заглавное слово. Свойства класса хранят остающуюся информацию. Метод, ответственный за чтение пиксельных данных, использует эти свойства. SelectedBands
свойство позволяет вам читать подмножество полос с набором по умолчанию, чтобы считать все полосы.
methods function obj = LanAdapter(fname) % LanAdapter constructor for LanAdapter class. % When creating a new LanAdapter object, read the file % header to validate the file as well as save some image % properties for later use. % Open the file. obj.Filename = fname; fid = fopen(fname,'r'); % Verify that the file begins with the headword 'HEADER' or % 'HEAD74', as per the Erdas LAN file specification. headword = fread(fid,6,'uint8=>char'); if ~(strcmp(headword','HEADER') || strcmp(headword',... 'HEAD74')) error('Invalid LAN file header.'); end % Read the data type from the header. pack_type = fread(fid,1,'uint16',0,'ieee-le'); if ~isequal(pack_type,0) error(['Unsupported pack type. The LanAdapter example ' ... 'only supports reading uint8 data.']); end % Provide band information. obj.NumBands = fread(fid,1,'uint16',0,'ieee-le'); % By default, return all bands of data obj.SelectedBands = 1:obj.NumBands; % Specify image width and height. unused_field = fread(fid,6,'uint8',0,'ieee-le'); width = fread(fid,1,'uint32',0,'ieee-le'); height = fread(fid,1,'uint32',0,'ieee-le'); obj.ImageSize = [height width]; % Close the file handle fclose(fid); end % LanAdapter
Классы адаптера имеют два требуемых метода, заданные в абстрактном суперклассе, ImageAdapter
. Все классы Адаптера Изображений должны реализовать эти методы. blockproc
функционируйте использует первый метод, readRegion
, считать блоки данных из файлов на диске. Второй метод, close
, выполняет любую необходимую очистку объекта Image Adapter.
function data = readRegion(obj, region_start, region_size) % readRegion reads a rectangular block of data from the file. % Prepare various arguments to MULTIBANDREAD. header_size = 128; rows = region_start(1):(region_start(1) + region_size(1) - 1); cols = region_start(2):(region_start(2) + region_size(2) - 1); % Call MULTIBANDREAD to get data. full_size = [obj.ImageSize obj.NumBands]; data = multibandread(obj.Filename, full_size,... 'uint8=>uint8', header_size, 'bil', 'ieee-le',... {'Row', 'Direct', rows},... {'Column','Direct', cols},... {'Band', 'Direct', obj.SelectedBands}); end % readRegion
readRegion
имеет два входных параметра, region_start
и region_size
. region_start
аргумент, двухэлементный вектор в форме [row col]
, задает первый пиксель в блоке данных запроса. region_size
аргумент, двухэлементный вектор в форме [num_rows num_cols]
, задает размер требуемого блока данных. readRegion
метод использует эти входные параметры, чтобы считать и возвратить требуемый блок данных в изображение.
readRegion
метод реализован по-другому для различных форматов файлов, в зависимости от того, какие инструменты доступны для чтения определенных файлов. readRegion
метод для LanAdapter
класс использует входные параметры, чтобы подготовить пользовательский вход к multibandread
. Для файлов LAN, multibandread
обеспечивает удобный способ считать определенные подразделы изображения.
Другой требуемый метод close
. close
метод LanAdapter
класс появляется следующим:
function close(obj) % Close the LanAdapter object. This method is a part % of the ImageAdapter interface and is required. % Since the readRegion method is "atomic", there are % no open file handles to close, so this method is empty. end end % public methods end % LanAdapter
Когда комментарии указывают, close
метод для LanAdapter
нечего делать, таким образом, close
isempty. multibandread
функция не требует обслуживания открытых дескрипторов файлов, таким образом, close
метод не имеет никаких указателей, чтобы вымыться. Классы Адаптера изображений для других форматов файлов могут иметь более существенный close
методы включая закрытие дескрипторов файлов и выполнение другой ответственности очистки класса.
Как записано, LanAdapter
класс может только считать файлы LAN, не пишут им. Если вы хотите записать выход в файл формата LAN или другой файл с форматом что blockproc
не поддерживает, реализует дополнительное writeRegion
метод. Затем можно задать класс как 'Destination'
параметр в blockproc
и запишите выход в файл вашего выбранного формата.
Подпись writeRegion
метод следующие:
function [] = writeRegion(obj, region_start, region_data)
Первый аргумент, region_start
, указывает на первый пиксель блока что writeRegion
записи метода. Второй аргумент, region_data
, содержит новые данные, которые метод пишет в файл.
Классы, которые реализуют writeRegion
метод может быть более комплексным, чем LanAdapter
. При создании перезаписываемого объекта Image Adapter классы часто несут дополнительную ответственность создания новых файлов в конструкторе класса. Это создание файла требует более комплексного синтаксиса в конструкторе, где потенциально необходимо задать размер и тип данных нового файла, вы хотите создать. Конструкторы, которые создают новые файлы, могут также столкнуться с другими проблемами, такими как полномочия файла операционной системы или потенциально трудный код создания файла.
blockproc
Теперь, когда вы понимаете как LanAdapter
класс работает, можно использовать его, чтобы улучшить видимые полосы файла LAN. Смотрите Вычислить Статистику для Большого примера Изображений, чтобы видеть, как blockproc
функция работает с LanAdapter
класс.
blockproc
| ImageAdapter
| multibandread