exponenta event banner

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

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

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

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

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

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

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

Выберите «Размер блока» для оптимизации производительности блока

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

Прочитайте файл изображения и преобразуйте его в файл TIFF.

I = imread('concordorthophoto.png','PNG');
imshow(I)

Figure contains an axes. The axes contains an object of type image.

imwrite(I,'concordorthophoto.tif','TIFF');

Использовать imfinfo чтобы определить, concordorthophoto.tif организован в полоски или плитки. RowsPerStrip области info struct указывает, что это изображение TIFF организовано в полоски с 34 рядами на полоску. Каждая полоса охватывает ширину изображения и имеет высоту 34 пикселя.

info = imfinfo('concordorthophoto.tif');
info.RowsPerStrip
ans = 34

Получение размера изображения из Height и Width поля info. Это изображение имеет размер 2215 на 2956 пикселей.

h = info.Height
h = 2215
w = info.Width
w = 2956

Случай 1: Квадратные блоки

Обработка изображения с использованием квадратных блоков размером 500 на 500 пикселей. Каждый раз blockproc функция осуществляет доступ к диску, считывает всю полосу и отбрасывает любую часть полосы, не включенную в текущий блок. С 34 рядами на полосу и 500 рядами на блок, blockproc 15 раз получает доступ к диску для каждого блока. Изображение имеет ширину приблизительно 6 блоков (2956/500 = 5,912). blockproc считывает одну и ту же полосу снова и снова для каждого блока, который включает в себя пиксели, содержащиеся в этой полосе. Поскольку изображение имеет ширину в шесть блоков, blockproc читает каждую полоску файла шесть раз.

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

Вариант 2: Колоннообразные блоки

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

Выберите ширину блока так, чтобы блоки имели приблизительно такое же количество пикселей, что и квадратный блок.

numCols = ceil(blockSizeSquare.^2 / h)
numCols = 113

Изображение шириной более 26 блоков (2956/numCols = 26.1593). Каждая полоска должна быть прочитана для каждого блока, поэтому blockproc считывает весь образ с диска 26 раз.

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

Случай 3: Рядообразные блоки

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

Выберите высоту блока так, чтобы блоки имели приблизительно такое же количество пикселей, что и квадратный блок.

numRows = ceil(blockSizeSquare.^2 / w)
numRows = 85

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

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

См. также

Связанные темы