ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ブロックのサイズとパフォーマンス

関数 blockproc を使用してイメージ ファイルを読み取ったり書き込んだりすると、ファイルにアクセスする回数によってパフォーマンスが大きな影響を受けます。一般的に、大きなブロック サイズを選択すると各ブロックを処理するためのメモリが増えるため、blockproc がディスクにアクセスする回数が減ります。ディスク上のファイル形式のレイアウトを把握しておくと、ディスクにアクセスする回数を最小限にするブロック サイズを選択するのに役立ちます。ファイル形式の詳細は、blockproc のリファレンス ページを参照してください。

TIFF イメージの特性

TIFF イメージでは、ディスク上のデータはタイルまたはストリップのいずれかで構成されています。タイル配置された TIFF イメージは、ファイル内に四角形ブロックのデータを連続して格納します。各タイルは 1 つの単位として読み書きされます。ストリップ レイアウトの TIFF イメージはデータをストリップに格納します。つまり、各ストリップの幅はイメージの幅全体になり、高さは 1 行以上です。タイルと同様に、各ストリップは 1 つの単位として格納され、読み書きされます。

TIFF 画像処理に適切なブロック サイズを選択するときは、TIFF イメージの構成を理解することが重要です。イメージがタイルまたはストリップのどちらで構成されているかを調べるには、関数 imfinfo を使用します。

TIFF イメージについて imfinfo が返した構造体には、TileWidth フィールドおよび TileLength フィールドが含まれています。これらのフィールドに有効な (空でない) 値が含まれている場合、イメージはタイル配置された TIFF であり、これらのフィールドにより各タイルのサイズが定義されています。これらのフィールドに空の ([]) 値が含まれている場合、TIFF はストリップで構成されています。ストリップ レイアウトの TIFF の場合は、構造体の RowsPerStrip フィールドを参照します。ここでは、データの各ストリップのサイズが定義されています。

TIFF イメージを読み取るとき、読み取り可能なデータの最小量は、TIFF のタイプによって、1 タイルまたは 1 ストリップです。blockproc のパフォーマンスを最適化するには、ディスク上での TIFF イメージの構成に対応するブロック サイズを選択します。こうすると、同じピクセルを何度も読み取らずにすみます。

ブロック サイズの選択

次の 3 つのケースは、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\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

RowsPerStrip の値 2 は、この TIFF イメージが高さ 2 行のストリップで構成されていることを示します。各ストリップの幅はイメージの幅 (2956 ピクセル) で、高さは 2 ピクセルです。次の 3 つのケースは、適切なブロック サイズを選択するとパフォーマンスがどのように向上するかを示しています。

ケース 1: 一般的なケース — 正方形ブロック

まず、サイズ [500 500] の正方形ブロックを考えてみます。関数 blockproc がディスクにアクセスするたびにストリップ全体を読み取り、現在のブロックに含まれていない部分を破棄します。ストリップあたり 2 行、ブロックあたり 500 行なので、関数 blockproc は各ブロックで 250 回ディスクにアクセスします。イメージの幅は 2956 ピクセルで1 ブロックが 500 行なので、約 6 ブロック (2956/500 = 5.912) あります。関数 blockproc は、あるストリップに含まれているピクセルを含む各ブロックで、同じストリップを何度も読み取ります。イメージの幅は 6 ブロックなので、blockproc はファイルの各ストリップを 6 回読み取ります。

tic, im = blockproc('concordorthophoto.tif',[500 500],@(s) s.data);
toc
経過時間は 17.806605 秒です。

ケース 2: 最悪のケース — 列型のブロック

ディスク上のファイルのレイアウトは行です (ストリップの TIFF イメージは常に行でまとめられ、列でまとめられていることはありません)。サイズ [2215 111] の列型ブロックについて考えてみます。ここで、ブロックの形はディスク上の実際のファイルのレイアウトと正反対です。

イメージの幅は 26 ブロック以上です (2956/111 = 26.631)。各ブロックの各ストリップを読み取らなければなりません。関数 blockproc はディスクからイメージ全体を 26 回読み取ります。列型ブロックをもつ画像処理にかかる時間は、ディスクが読み取る回数に比例します。ケース 1 と比較して、ケース 2 ではディスクの読み取りを約 4 倍行うため、経過時間は約 4 倍になります。

tic, im = blockproc('concordorthophoto.tif',[2215 111],@(s) s.data);
toc
経過時間は 60.766139 秒です。

ケース 3: 最善のケース — 行型のブロック

最後に、TIFF ストリップに合わせてサイズが [84 2956] のブロックを選択します。各ブロックの幅はイメージの幅です。各ストリップは 1 回だけ読み取られ、特定のブロックのすべてのデータはディスクに連続して格納されます。

tic, im = blockproc('concordorthophoto.tif',[84 2956],@(s) s.data);
toc
経過時間は 4.610911 秒です。