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

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

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

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

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

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

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

Выберите размер блока, чтобы оптимизировать эффективность blockproc

В этом примере показано, как размер блока влияет на эффективность 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 ли организован в полосах или плитках. The 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.

См. также

Похожие темы