块大小和性能
在使用blockproc
函数读取或写入映像文件时,访问文件的次数会显著影响性能。一般来说,选择较大的块大小可以减少次数blockproc
必须访问磁盘,以使用更多内存来处理每个块为代价。了解磁盘上的文件格式布局可以帮助您选择块大小,从而最大限度地减少访问磁盘的次数。看到blockproc
有关文件格式的更多信息,请参阅参考页。
TIFF图像特性
TIFF图像以以下两种方式之一组织磁盘上的数据:按块或按条组织。平铺TIFF图像在文件中连续存储矩形数据块。每个贴图作为一个单元进行读写。具有条形布局的TIFF图像的数据存储在条形中;每个条带跨越图像的整个宽度,并且在高度上是一行或多行。像瓷砖一样,每个条带作为一个单元存储、读取和写入。
在为TIFF图像处理选择合适的块大小时,了解TIFF图像的组织非常重要。若要了解图像是按条状还是按块状组织,请使用imfinfo
函数。
返回的结构体imfinfo
的TIFF图像包含字段TileWidth
和TileLength
.如果这些字段具有有效的(非空的)值,则图像是平铺的TIFF,这些字段定义每个平铺的大小。如果这些字段包含空([]
),然后将TIFF组织成条状。对于带条形布局的tiff,请参考struct字段RowsPerStrip
,它定义了每个数据条的大小。
在读取TIFF图像时,可以读取的最小数据量是单个tile或单个strip,具体取决于TIFF的类型。优化…的性能blockproc
,选择与您的TIFF图像在磁盘上的组织方式密切对应的块大小。通过这种方式,您可以避免多次重复读取相同的像素。
选择块大小
下面三个案例演示了块大小对性能的影响blockproc
.在每种情况下,每个块中的像素总数大致相同;只有块的大小不同。
首先,读入图像文件并将其转换为TIFF格式。
imageA = imread('concordorthophoto.png','PNG');imwrite (imageA concordorthophoto.tif, TIFF);
使用imfinfo
来确定是否concordorthophoto.tif
以条状或条状排列。
imfinfo concordorthophoto.tif
从结构中选择字段如下所示:
ans = struct with fields: Filename: '\\fs-21-ah\home$\jholohan\Documents\MATLAB\ concordorthphoto .tif' FileModDate: '10- 11/2016 17:34:44' FileSize: 6586702格式:'tif' FormatVersion: [] Width: 2956 Height: 2215 BitDepth: 8 ColorType: 'grayscale' FormatSignature: [73 73 42 0] ByteOrder: ' low -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阈值:1 Offset: 6585984
值2 inRowsPerStrip
表示此TIFF图像按条组织,每个条有两行。每个条带横跨图像的宽度(2956像素),高2像素。以下三个案例说明了如何选择合适的块大小来提高性能。
案例1:典型案例-方块
首先尝试一个正方形的大小块(500 500)
.每一次blockproc
函数访问它在整个条带中读取的磁盘,并丢弃条带中不包括在当前块中的任何部分。每个条带两行,每个块500行blockproc
函数对每个块访问磁盘250次。图像是2956像素宽,500行宽,或者大约6个块宽(2956/500 = 5.912)。的blockproc
函数为包含该条带中包含的像素的每个块一次又一次地读取相同的条带。因为图像的宽度是六个街区,blockproc
读取文件的每个条带六次。
Tic, im = blockproc(' concordorthphoto .tif',[500 500],@(s) .data);toc
运行时间为17.806605秒。
情况2:最坏情况-柱状块
磁盘上文件的布局以行为单位。(剥离后的TIFF图像总是按行组织,而不是按列组织。)尝试选择大小为[2215 111]的列形状的块。现在,该块的形状与磁盘上的实际文件布局完全相反。
图像宽度超过26个块(2956/111 = 26.631)。必须为每个块读取每个条带。的blockproc
函数从磁盘读取整个映像26次。用柱状块处理图像所需的时间与磁盘读取次数成正比。与情形1相比,情形2中的磁盘读取次数大约是情形1的4倍,因此运行时间大约是情形1的4倍。
Tic, im = blockproc(' concordorthphoto .tif',[2215111],@(s) .data);toc
运行时间为60.766139秒。
案例3:最佳案例-行形块
最后,选择一个与TIFF条带对齐的块,大小为[84 2956]。每个块横跨图像的宽度。每个条带只读取一次,特定块的所有数据连续存储在磁盘上。
Tic, im = blockproc(' concordorthphoto .tif',[84 2956],@(s) s.data);toc
运行时间为4.610911秒。