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

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

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

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

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

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

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

Выберите Block Size to Optimize blockproc Эффективность

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

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

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

Figure contains an axes object. The axes object 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.400848 seconds.

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

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

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

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.167790 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.118492 seconds.

Смотрите также

Похожие темы