При использовании 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.
I = imread('concordorthophoto.png','PNG'); imshow(I)
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.292298 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.151886 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.122653 seconds.