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

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

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

Дополнительные сведения о формате файла LAN

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

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

БайтыТип данныхСодержимое
1–6Массив 6 байтов символов, идентифицирующих версию формата файла'HEADER' или 'HEAD74' (Pre-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

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 класс. Изучение LanAdapter класс помогает вам подготовиться к написанию собственного класса Image Adapter. Если вы новичок в объектно-ориентированном программировании, смотрите Разработку классов - Типичный рабочий процесс для получения общей информации о записи классов.

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

Classdef

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

Использование класса LanAdapter с blockproc

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

См. также

| |

Похожие темы