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

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

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

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

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

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

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

| |

Похожие темы