В дополнение к чтению TIFF или файлов JPEG2000 и записи файлов TIFF, функция blockproc
может считать и записать другие форматы. Чтобы работать с данными изображения в другом формате файла, необходимо создать класс, который наследовался классу ImageAdapter
. Класс ImageAdapter
является абстрактным классом (MATLAB), который является частью программного обеспечения Image Processing Toolbox™. Это задает подпись для методов, которые blockproc
использует для файлового ввода-вывода с изображениями на диске. Можно сопоставить экземпляры класса Адаптера Изображений с файлом и использовать их в качестве аргументов к blockproc
для основанной на файле обработки блока.
Этот раздел демонстрирует процесс записи класса Адаптера Изображений путем обсуждения класса в качестве примера (класс LanAdapter
). Класс LanAdapter
является частью тулбокса. Используйте этот простой, класс только для чтения, чтобы обработать произвольно большие файлы LAN uint8
с 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
помогает подготовить вас к записи вашего собственного класса Адаптера Изображений. Если вы плохо знакомы с объектно-ориентированным программированием, смотрите Классы Разработки — Типичный Рабочий процесс (MATLAB) для получения общей информации о записи классов.
Откройте 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
пуст. Функция 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
.
ImageAdapter
| blockproc
| multibandread