При использовании blockproc
функция для чтения или записи файлов изображений, количество обращений к файлу может значительно повлиять на эффективность. В целом выбор больших размеров блоков уменьшает количество раз blockproc
должен получить доступ к диску за счет использования большего количества памяти для обработки каждого блока. Знание размещения формата файла на диске может помочь вам выбрать размеры блоков, которые минимизируют количество обращений к диску.
Изображения TIFF организуют свои данные на диске одним из двух способов: в плитках или в полосах. Мозаичное изображение TIFF сохраняет прямоугольные блоки данных непрерывно в файле. Каждая плитка считывается и записывается как один модуль. Изображения TIFF с размещением полосы имеют данные, хранящиеся в полосах; каждая полоса охватывает всю ширину изображения и составляет одну или несколько строк в высоту. (Обрезанные изображения TIFF всегда организованы в строки, никогда не в столбцы.) Как и плитка, каждая полоса хранится, считывается и записывается как единый модуль.
При выборе подходящего размера блока для обработки изображений TIFF важно понимание организации вашего изображения TIFF. Чтобы узнать, организовано ли ваше изображение в плитках или полосах, используйте imfinfo
функция.
Возвращенный struct imfinfo
для изображений TIFF содержит поля TileWidth
и TileLength
. Если эти поля имеют допустимые (непустые) значения, то изображение представляет собой мозаичный TIFF, и эти поля определяют размер каждой плитки. Если эти поля содержат значения пустых ([]
), затем TIFF организуется полосами. Для TIFF с ленточными размещениями смотрите поле struct RowsPerStrip
, который определяет размер каждой полосы данных.
При чтении изображений TIFF минимальный объем данных, который можно считать, является одной плиткой или одной полосой, в зависимости от типа TIFF. Оптимизация эффективности blockproc
выберите размеры блоков, которые тесно соответствуют тому, как ваше изображение TIFF организовано на диске. Таким образом, можно избежать повторного чтения тех же пикселей несколько раз.
В этом примере показано, как размер блока влияет на эффективность blockproc
. В каждом из этих случаев общее количество пикселей в каждом блоке приблизительно одинаковое. Различаются только размерности блоков.
Считайте файл изображения и преобразуйте его в файл TIFF.
I = imread('concordorthophoto.png','PNG'); imshow(I)
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.