При использовании blockproc
функционируйте, чтобы или считать или записать файлы изображений, число раз, к файлу получают доступ, может значительно влиять на производительность. В общем случае выбор больших размеров блока уменьшает число раз blockproc
должен получить доступ к диску, за счет использования большей памяти, чтобы обработать каждый блок. Знание размещения формата файла на диске может помочь вам выбрать размеры блока, которые минимизируют число раз, к диску получают доступ. Смотрите blockproc
страница с описанием для получения дополнительной информации о форматах файлов.
Изображения TIFF организуют свои данные по диску одним из двух способов: в мозаиках или в полосах. Мозаичное изображение TIFF хранит прямоугольные блоки данных непрерывно в файле. Каждая мозаика считана и записана как единый блок. Изображениям TIFF с размещением полосы сохранили данные в полосах; каждая полоса охватывает целую ширину изображения и является одной или несколькими строками в высоте. Как мозаика, каждая полоса хранится, чтение, и записанный как единый блок.
Когда выбор соответствующего размера блока для обработки изображения TIFF, изучая организацию вашего изображения TIFF важен. Чтобы узнать, организовано ли ваше изображение в мозаиках или полосах, используйте imfinfo
функция.
Struct возвращен imfinfo
поскольку изображения TIFF содержат поля TileWidth
и TileLength
. Если эти поля имеют допустимые (непустые) значения, то изображением является мозаичный TIFF, и эти поля задают размер каждой мозаики. Если эти поля содержат значения пустых ([]
), затем TIFF организован в полосах. Для TIFF с размещением полосы обратитесь к полю RowsPerStrip
struct, который задает размер каждой полосы данных.
При чтении изображений TIFF минимальное количество данных, которые могут быть считаны, является одной мозаикой или одной полосой, в зависимости от типа TIFF. Оптимизировать производительность blockproc
, выберите размеры блока, которые соответствуют тесно тому, как ваше изображение TIFF организовано на диске. Таким образом можно постараться не перечитывать те же пиксели многократно.
Следующие три случая демонстрируют влияние размера блока на производительности blockproc
. В каждом из этих случаев общее количество пикселей в каждом блоке является приблизительно тем же самым; только размер блоков отличается.
Во-первых, читайте в файле изображения и преобразуйте его в TIFF.
imageA = imread('concordorthophoto.png','PNG'); imwrite(imageA,'concordorthophoto.tif','TIFF');
Используйте imfinfo
определить ли concordorthophoto.tif
организован в полосах или мозаиках.
imfinfo concordorthophoto.tif
Избранные поля от struct появляются ниже:
ans = struct with fields: Filename: '\\fs-21-ah\home$\jholohan\Documents\MATLAB\concordorthophoto.tif' FileModDate: '10-Nov-2016 17:34:44' FileSize: 6586702 Format: 'tif' FormatVersion: [] Width: 2956 Height: 2215 BitDepth: 8 ColorType: 'grayscale' FormatSignature: [73 73 42 0] ByteOrder: 'little-endian' NewSubFileType: 0 BitsPerSample: 8 Compression: 'PackBits' PhotometricInterpretation: 'BlackIsZero' StripOffsets: [1×66 double] SamplesPerPixel: 1 RowsPerStrip: 34 StripByteCounts: [1×66 double] XResolution: 72 YResolution: 72 ResolutionUnit: 'Inch' Colormap: [] PlanarConfiguration: 'Chunky' TileWidth: [] TileLength: [] TileOffsets: [] TileByteCounts: [] Orientation: 1 FillOrder: 1 GrayResponseUnit: 0.0100 MaxSampleValue: 255 MinSampleValue: 0 Thresholding: 1 Offset: 6585984
Значение 2 в RowsPerStrip
указывает, что это изображение TIFF организовано в полосах с двумя строками на полосу. Каждая полоса охватывает ширину изображения (2 956 пикселей) и два пикселя высотой. Следующие три случая иллюстрируют, как выбор соответствующего размера блока может улучшать производительность.
Сначала попробуйте квадратный блок размера [500 500]
. Каждый раз blockproc
функциональные доступы диск это читает в целой полосе и отбрасывает любую часть полосы, не включенной в текущий блок. С двумя строками на полосу и 500 строками на блок, blockproc
функциональные доступы дисковые 250 времена для каждого блока. Изображение 2 956 пикселей шириной и 500 широких строк, или приблизительно шесть широких блоков (2956/500 = 5.912). blockproc
функционируйте читает ту же полосу много раз для каждого блока, который включает пиксели, содержавшиеся в той полосе. Поскольку изображение является шестью широкими блоками, blockproc
читает каждую полосу файла шесть раз.
tic, im = blockproc('concordorthophoto.tif',[500 500],@(s) s.data);
toc
Elapsed time is 17.806605 seconds.
Размещение файла на диске находится в строках. (Разделенные изображения TIFF всегда организуются в строках, никогда в столбцах.) Пытаются выбрать блоки, сформированные как столбцы размера [2215 111]. Теперь блок формируется точно напротив фактического размещения файла на диске.
Изображение является более чем 26 широкими блоками (2956/111 = 26.631). Каждая полоса должна быть считана из каждого блока. blockproc
функционируйте читает целое изображение с дисковых 26 времен. Количество времени, которое это занимает, чтобы обработать изображение с блоками, имеющими форму столбца, пропорционально количеству чтения с диска. Приблизительно с в четыре раза больше чтения с диска в случае, если 2, по сравнению со Случаем 1, прошедшее время приблизительно в четыре раза более долго.
tic, im = blockproc('concordorthophoto.tif',[2215 111],@(s) s.data);
toc
Elapsed time is 60.766139 seconds.
Наконец, выберите блок, который выравнивается с полосами TIFF, блоком размера [84 2956]. Каждый блок охватывает ширину изображения. Каждая полоса читается точно одно время, и все данные для конкретного блока хранятся непрерывно на диске.
tic, im = blockproc('concordorthophoto.tif',[84 2956],@(s) s.data);
toc
Elapsed time is 4.610911 seconds.