Помимо чтения файлов TIFF или JPEG2000 и записи файлов TIFF, blockproc функция может считывать и записывать другие форматы. Для работы с данными изображения в другом формате файла необходимо создать класс, наследующий от ImageAdapter класс. ImageAdapter класс - абстрактный класс, являющийся частью программного обеспечения Toolbox™ обработки изображений. Он определяет подпись для методов, которые blockproc используется для ввода-вывода файлов с образами на диске. Можно связать экземпляры класса Image Adapter с файлом и использовать их в качестве аргументов для blockproc для обработки блоков на основе файлов.
В этом разделе демонстрируется процесс написания класса Image Adapter путем обсуждения примера класса ( LanAdapter класс). LanAdapter является частью панели инструментов. Используйте этот простой класс только для чтения для обработки произвольно больших uint8 файлы LAN с blockproc.
Чтобы понять, как LanAdapter класс работает, сначала необходимо знать о формате файла LAN. Тематическое мэпперное изображение Landsat хранится в формате Erdas LAN. Файлы Erdas LAN содержат 128-байтовый заголовок, за которым следует один или более спектральных диапазонов данных, чередующихся по полосам (BIL), в порядке увеличения числа полос. Данные хранятся в порядке байтов little-endian. Заголовок содержит несколько частей важной информации о файле, включая размер, тип данных и количество областей изображения, содержащихся в файле. Спецификация формата файла 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
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 класс. Чтобы записать класс Image Adapter для определенного формата файла, необходимо иметь возможность:
Запрос размера файла на диске
Считывание прямоугольного блока данных из файла
При выполнении этих двух условий можно записать класс адаптера образа для файлов LAN. Можно проанализировать заголовок изображения, чтобы запросить размер файла, и можно изменить вызов на multibandread для считывания определенного блока данных. Вы можете инкапсулировать код для этих двух целей в структуру класса Image Adapter, а затем работать непосредственно с большими файлами LAN с помощью blockproc функция. LanAdapter класс является классом Image Adapter для файлов LAN и является частью ПО Image Processing Toolbox.
В этом разделе описываются конструктор, свойства и методы LanAdapter класс. Изучение LanAdapter помогает подготовить вас к написанию собственного класса Image Adapter. Если вы новичок в объектно-ориентированном программировании, обратитесь к разделу Разработка классов - типичный рабочий процесс для получения общей информации о написании классов.
Открытый 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. При создании объекта адаптера образа с возможностью записи классы часто несут дополнительную ответственность за создание новых файлов в конструкторе класса. Это создание файла требует более сложного синтаксиса в конструкторе, где потенциально необходимо указать размер и тип данных нового файла, который требуется создать. Конструкторы, создающие новые файлы, могут также столкнуться с другими проблемами, такими как права доступа к файлам операционной системы или потенциально трудный код создания файлов.
blockprocТеперь, когда вы понимаете, как LanAdapter класс работает, его можно использовать для расширения видимых полос файла LAN. См. пример «Вычислить статистику для больших изображений», чтобы увидеть, как blockproc функция работает с LanAdapter класс.
blockproc | ImageAdapter | multibandread