В дополнение к чтению TIFF или JPEG2000 файлов и записи TIFF файлов, blockproc
функция может читать и записывать другие форматы. Чтобы работать с данными изображений в другом формате файла, необходимо создать класс, который наследует от ImageAdapter
класс. The ImageAdapter
класс является абстрактным классом, который является частью программного обеспечения Image Processing Toolbox™. Он определяет сигнатуру для методов, которые blockproc
используется для ввода-вывода файлов с изображениями на диске. Можно связать образцы класса Image Adapter с файлом и использовать их в качестве аргументов для blockproc
для обработки блоков на основе файлов.
Этот раздел демонстрирует процесс записи класса Image Adapter путем обсуждения примера класса (LanAdapter
класс). The LanAdapter
класс является частью тулбокса. Используйте этот простой класс только для чтения, чтобы обработать произвольно большие uint8
Файлы LAN с blockproc
.
Чтобы понять, как LanAdapter
класс работает, вы должны сначала знать о формате файла LAN. Тематические изображения mapper Landsat хранятся в формате файла локальной сети Erdas. Файлы LAN-файлы содержат 128-байтовый заголовок, за которым следует одна или несколько спектральных полос данных, перемежающихся по полосам (BIL), в порядке увеличения количества полос. Данные хранятся в маленьком-эндовом порядке байтов. Заголовок содержит несколько частей важной информации о файле, включая размер, тип данных и количество полос изображений, содержащихся в файле. Спецификация формата файла LAN определяет первые 24 байта заголовка файла, как показано в таблице.
Содержимое заголовка файла
Байты | Тип данных | Содержимое |
---|---|---|
1–6 | Массив 6 байтов символов, идентифицирующих версию формата файла | 'HEADER' или 'HEAD74' (Pre-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
The rio.lan
файл представляет собой 7-диапазонное изображение 512 на 512. Тип пакета 0 указывает, что каждая выборка является 8-битным беззнаковым целым числом (uint8
тип данных).
В типичном рабочем процессе в памяти вы бы прочитали этот файл LAN, используя multibandread
функция. Формат LAN сохраняет данные RGB из видимого спектра в полосах 3, 2 и 1, соответственно. Вы можете создать изображение truecolor для дальнейшей обработки.
truecolor = multibandread('rio.lan', [512, 512, 7],... 'uint8=>uint8', 128,'bil', 'ieee-le', {'Band','Direct',[3 2 1]});
Однако для очень больших файлов LAN чтение и обработка всего изображения в памяти с помощью multibandread
может быть непрактичным, в зависимости от возможностей вашей системы. Чтобы избежать ограничений памяти, используйте blockproc
функция. С blockproc
можно обрабатывать изображения с помощью файлового рабочего процесса. Можно читать, обрабатывать, а затем записывать результаты по одному блоку за раз.
The blockproc
функция поддерживает только чтение и запись определенных форматов файлов, но расширяется через ImageAdapter
класс. Чтобы записать класс Image Adapter для определенного формата файла, необходимо иметь возможность:
Запросить размер файла на диске
Считайте прямоугольный блок данных из файла
Если вы удовлетворяете этим двум условиям, можно записать класс Image Adapter для файлов LAN. Можно проанализировать заголовок изображения, чтобы запросить размер файла, и можно изменить вызов на multibandread
для чтения определенного блока данных. Можно инкапсулировать код для этих двух целей в структуру класса Image Adapter, а затем работать непосредственно с большими файлами LAN с blockproc
функция. The LanAdapter
Класс является классом Image Adapter для файлов LAN и является частью программного обеспечения Image Processing Toolbox.
В этом разделе описываются конструктор, свойства и методы LanAdapter
класс. Изучение LanAdapter
класс помогает вам подготовиться к написанию собственного класса Image Adapter. Если вы новичок в объектно-ориентированном программировании, смотрите Разработку классов - Типичный рабочий процесс для получения общей информации о записи классов.
Откройте LanAdapter.m
и посмотрите на реализацию LanAdapter
класс.
The LanAdapter
класс начинается с ключевого слова classdef
. The classdef
раздел определяет имя класса и указывает, что LanAdapter
наследует от ImageAdapter
суперкласс. Наследование от ImageAdapter
позволяет новому классу:
Взаимодействие с blockproc
Задайте общие ImageAdapter
свойства
Определите интерфейс, который blockproc
используется для чтения и записи в файлы LAN
Следуя classdef
раздел, LanAdapter
класс содержит два блока свойств классов. Первый блок содержит свойства, которые являются публично видимыми, но не изменяемыми публично. Второй блок содержит полностью общественную собственность. The LanAdapter
класс хранит некоторую информацию из заголовка файла как свойства класса. Другие классы, которые также наследуют от ImageAdapter
, но которые поддерживают различные форматы файлов, могут иметь различные свойства.
classdef LanAdapter < ImageAdapter properties(GetAccess = public, SetAccess = private) Filename NumBands end properties(Access = public) SelectedBands end
В дополнение к свойствам, заданным в LanAdapter.m
, класс наследует ImageSize
свойство от ImageAdapter
суперкласс. Новый класс устанавливает ImageSize
свойство в конструкторе.
Конструктор классов инициализирует LanAdapter
объект. The LanAdapter
конструктор анализирует информацию о заголовке файла LAN и устанавливает свойства класса. Реализуйте конструктор, метод класса, внутри methods
блок.
Конструктор содержит большую часть того же кода, используемого для анализа заголовка файла LAN. The LanAdapter
класс поддерживает только uint8
файлы типов данных, поэтому конструктор проверяет тип пакета файла LAN, а также заголовок. Оставшиеся сведения хранятся в свойствах класса. Метод, ответственный за чтение пиксельных данных, использует эти свойства. The 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
. Все классы Image Adapter должны реализовать эти методы. The 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
. The region_start
аргумент, двухэлементный вектор в форме [row col]
, задает первый пиксель в запрос блоке данных. The region_size
аргумент, двухэлементный вектор в форме [num_rows num_cols]
, определяет размер запрашиваемого блока данных. The readRegion
метод использует эти входные параметры, чтобы считать и вернуть запрошенный блок данных с изображения.
The readRegion
метод реализован по-разному для различных форматов файлов, в зависимости от того, какие инструменты доступны для чтения конкретных файлов. The readRegion
метод для LanAdapter
класс использует входные параметры, чтобы подготовить пользовательский вход для multibandread
. Для файлов LAN, multibandread
предоставляет удобный способ чтения конкретных подсекций изображения.
Другой необходимый метод close
. The 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
пуст. The multibandread
функция не требует обслуживания открытых указателей на файлы, поэтому close
метод не имеет указателей для очистки. Классы Image Adapter для других форматов файлов могут иметь более существенные 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