Выполните обработку блока на файлах изображений в неподдерживаемых форматах

В дополнение к чтению TIFF или файлов JPEG2000 и записи файлов TIFF, функция blockproc может считать и записать другие форматы. Чтобы работать с данными изображения в другом формате файла, необходимо создать класс, который наследовался классу ImageAdapter. Класс ImageAdapter является абстрактным классом (MATLAB), который является частью программного обеспечения Image Processing Toolbox™. Это задает подпись для методов, которые blockproc использует для файлового ввода-вывода с изображениями на диске. Можно сопоставить экземпляры класса Адаптера Изображений с файлом и использовать их в качестве аргументов к blockproc для основанной на файле обработки блока.

Этот раздел демонстрирует процесс записи класса Адаптера Изображений путем обсуждения класса в качестве примера (класс LanAdapter). Класс LanAdapter является частью тулбокса. Используйте этот простой, класс только для чтения, чтобы обработать произвольно большие файлы LAN uint8 с blockproc.

Получение дополнительной информации о формате файла LAN

Чтобы понять, как класс LanAdapter работает, необходимо сначала знать о формате файла LAN. Landsat тематическое формирование изображений картопостроителя хранится в формате файла LAN Эрдаса. Файлы LAN Эрдаса содержат 128-байтовый заголовок, сопровождаемый одним или несколькими диапазонами данных, разделенных по строкам (BIL), в порядке увеличения числа полосы. Данные хранятся в прямом порядке байтов. Заголовок содержит несколько частей важной информации о файле, включая размер, тип данных и количество полос формирования изображений, содержавшегося в файле. Спецификация формата файла LAN задает первые 24 байта заголовка файла как показано в таблице.

Содержимое заголовка файла

БайтыТип данныхСодержимое
1–66 массивов байтов символов, которые идентифицируют версию формата файла'HEADER' или 'HEAD74' (Пред7.4 файлов говорят 'HEADER'.)
7–816-битное целое числоУпакуйте тип файла (глубина индикаторного разряда)
9–1016-битное целое числоКоличество полос данных
11–166 байтовНеиспользованный
17–2032-битное целое числоКоличество столбцов данных
21–2432-битное целое числоКоличество строк данных

Остающиеся 104 байта содержат различные другие свойства файла, который не использует этот пример.

Парсинг заголовка

Как правило, при работе с файлами LAN, первый шаг должен узнать больше о файле путем парсинга заголовка. Следующий код показывает, как проанализировать заголовок файла rio.lan:

  1. Откройте файл:

    file_name = 'rio.lan';
    fid = fopen(file_name,'r');
  2. Считайте первые шесть байтов заголовка:

    headword = fread(fid,6,'uint8=>char')';
    fprintf('Version ID: %s\n',headword);
  3. Считайте тип пакета:

    pack_type = fread(fid,1,'uint16',0,'ieee-le');
    fprintf('Pack Type: %d\n',pack_type);
  4. Считайте количество диапазонов:

    num_bands = fread(fid,1,'uint16',0,'ieee-le');
    fprintf('Number of Bands: %d\n',num_bands);
  5. Считайте ширину изображения и высоту:

    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);
  6. Закройте файл:

    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 помогает подготовить вас к записи вашего собственного класса Адаптера Изображений. Если вы плохо знакомы с объектно-ориентированным программированием, смотрите Классы Разработки — Типичный Рабочий процесс (MATLAB) для получения общей информации о записи классов.

Откройте LanAdapter.m и посмотрите на реализацию класса LanAdapter.

Classdef

Класс 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 классы часто несут дополнительную ответственность создания новых файлов в конструкторе класса. Это создание файла требует более комплексного синтаксиса в конструкторе, где потенциально необходимо задать размер и тип данных нового файла, вы хотите создать. Конструкторы, которые создают новые файлы, могут также столкнуться с другими проблемами, такими как полномочия файла операционной системы или потенциально трудный код создания файла.

Используя класс LanAdapter с blockproc

Теперь, когда вы понимаете, как класс LanAdapter работает, можно использовать его, чтобы улучшить видимые полосы файла LAN. Смотрите Вычислить Статистику для Большого примера Изображений, чтобы видеть, как функция blockproc работает с классом LanAdapter.

Смотрите также

| |

Похожие темы