Размер блока и производительность

При использовании функции blockproc, чтобы или читать или записать файлы изображений, число раз, к файлу получают доступ, может значительно влиять на производительность. В целом выбор больших размеров блока уменьшает число раз, blockproc должен получить доступ к диску, за счет использования большей памяти, чтобы обработать каждый блок. Знание размещения формата файла на диске может помочь вам выбрать размеры блока, которые минимизируют число раз, к диску получают доступ. Смотрите страницу с описанием blockproc для получения дополнительной информации о форматах файлов.

Характеристики изображения TIFF

Изображения TIFF организуют свои данные по диску одним из двух способов: в мозаиках или в полосах. Мозаичное изображение TIFF хранит прямоугольные блоки данных непрерывно в файле. Каждая мозаика считана и записана как единый блок. Изображениям TIFF с размещением полосы сохранили данные в полосах; каждая полоса охватывает целую ширину изображения и является одной или несколькими строками в высоте. Как мозаика, каждая полоса хранится, чтение, и записанный как единый блок.

Когда выбор соответствующего размера блока для обработки изображения TIFF, понимая организацию вашего изображения TIFF важен. Чтобы узнать, организовано ли ваше изображение в мозаиках или полосах, используйте функцию imfinfo.

Struct, возвращенный imfinfo для изображений TIFF, содержит поля TileWidth и TileLength. Если эти поля имеют допустимые (непустые) значения, то изображением является мозаичный TIFF, и эти поля задают размер каждой мозаики. Если эти поля содержат значения пустых ([]), то TIFF организован в полосах. Для TIFF с размещением полосы обратитесь к полю RowsPerStrip struct, которое задает размер каждой полосы данных.

При чтении изображений TIFF минимальное количество данных, которые могут быть считаны, является одной мозаикой или одной полосой, в зависимости от типа TIFF. Чтобы оптимизировать производительность blockproc, выберите размеры блока, которые соответствуют тесно тому, как ваше изображение TIFF организовано на диске. Таким образом можно постараться не перечитывать те же пиксели многократно.

Выбор размера блока

Следующие три случая демонстрируют влияние размера блока на производительности blockproc. В каждом из этих случаев общее количество пикселей в каждом блоке является приблизительно тем же самым; только размер блоков отличается.

Во-первых, читайте в файле изображения и преобразуйте его в TIFF.

imageA = imread('concordorthophoto.png','PNG');
imwrite(imageA,'concordorthophoto.tif','TIFF');

Используйте imfinfo, чтобы определить, организован ли concordorthophoto.tif в полосах или мозаиках.

imfinfo concordorthophoto.tif

Избранные поля от struct появляются ниже:

ans = 

  struct with fields:

                     Filename: '\\fs-21-ah\home$\jholohan\Documents\MATLAB\concordorthophoto.tif'
                  FileModDate: '10-Nov-2016 17:34:44'
                     FileSize: 6586702
                       Format: 'tif'
                FormatVersion: []
                        Width: 2956
                       Height: 2215
                     BitDepth: 8
                    ColorType: 'grayscale'
              FormatSignature: [73 73 42 0]
                    ByteOrder: 'little-endian'
               NewSubFileType: 0
                BitsPerSample: 8
                  Compression: 'PackBits'
    PhotometricInterpretation: 'BlackIsZero'
                 StripOffsets: [1×66 double]
              SamplesPerPixel: 1
                 RowsPerStrip: 34
              StripByteCounts: [1×66 double]
                  XResolution: 72
                  YResolution: 72
               ResolutionUnit: 'Inch'
                     Colormap: []
          PlanarConfiguration: 'Chunky'
                    TileWidth: []
                   TileLength: []
                  TileOffsets: []
               TileByteCounts: []
                  Orientation: 1
                    FillOrder: 1
             GrayResponseUnit: 0.0100
               MaxSampleValue: 255
               MinSampleValue: 0
                 Thresholding: 1
                       Offset: 6585984

Значение 2 в RowsPerStrip указывает, что это изображение TIFF организовано в полосах с двумя строками на полосу. Каждая полоса охватывает ширину изображения (2 956 пикселей) и два пикселя высотой. Следующие три случая иллюстрируют, как выбор соответствующего размера блока может улучшать производительность.

Случай 1: типичный случай — квадратный блок

Сначала попробуйте квадратный блок размера [500 500]. Каждый раз, когда функция blockproc получает доступ к диску, это читает в целой полосе и отбрасывает любую часть полосы, не включенной в текущий блок. С двумя строками на полосу и 500 строками на блок, функция blockproc получает доступ к дисковым 250 временам для каждого блока. Изображение 2 956 пикселей шириной и 500 широких строк, или приблизительно шесть широких блоков (2956/500 = 5.912). Функция blockproc читает ту же полосу много раз для каждого блока, который включает пиксели, содержавшиеся в той полосе. Поскольку изображение является шестью широкими блоками, blockproc читает каждую полосу файла шесть раз.

tic, im = blockproc('concordorthophoto.tif',[500 500],@(s) s.data);
toc
Elapsed time is 17.806605 seconds.

Случай 2: худший случай — блок, имеющий форму столбца

Размещение файла на диске находится в строках. (Разделенные изображения TIFF всегда организуются в строках, никогда в столбцах.) Пытаются выбрать блоки, сформированные как столбцы размера [2215 111]. Теперь блок формируется точно напротив фактического размещения файла на диске.

Изображение является более чем 26 широкими блоками (2956/111 = 26.631). Каждая полоса должна быть считана из каждого блока. Функция blockproc читает целое изображение с дисковых 26 времен. Количество времени, которое это занимает, чтобы обработать изображение с блоками, имеющими форму столбца, пропорционально количеству чтения с диска. Приблизительно с в четыре раза больше чтения с диска в случае, если 2, по сравнению со Случаем 1, прошедшее время приблизительно в четыре раза более долго.

tic, im = blockproc('concordorthophoto.tif',[2215 111],@(s) s.data);
toc
Elapsed time is 60.766139 seconds.

Случай 3: лучший случай — блок, имеющий форму строки

Наконец, выберите блок, который выравнивается с полосами TIFF, блоком размера [84 2956]. Каждый блок охватывает ширину изображения. Каждая полоса читается точно одно время, и все данные для конкретного блока хранятся непрерывно на диске.

tic, im = blockproc('concordorthophoto.tif',[84 2956],@(s) s.data);
toc
Elapsed time is 4.610911 seconds.

Для просмотра документации необходимо авторизоваться на сайте