ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

イメージ ファイルの並列バッチ処理

この例では、一連のイメージ ファイルを並列にバッチ処理する方法を示します。共通の画像処理作業では、ファイル セットに画像処理アルゴリズムを適用します。アルゴリズムが複雑な計算を行う場合、多数のファイルを処理する場合またはファイルが非常に大きい場合、この手順は時間がかかることがあります。

Parallel Computing Toolbox™ ソフトウェアをもっている場合、バッチ処理のパフォーマンスが向上します。

処理対象ファイルの名前の取得

共通の接頭語が付いているファイル名をリストします。この例では、イメージ ファイルはラット前立腺癌細胞の 10 枚 1 組の顕微鏡写真です。これらのファイルは、取得した 100 イメージのうちの最初の 10 枚です。

p = which('AT3_1m4_01.tif');
filelist = dir([fileparts(p) filesep 'AT3_1m4_*.tif']);
fileNames = {filelist.name}'
fileNames = 

    'AT3_1m4_01.tif'
    'AT3_1m4_02.tif'
    'AT3_1m4_03.tif'
    'AT3_1m4_04.tif'
    'AT3_1m4_05.tif'
    'AT3_1m4_06.tif'
    'AT3_1m4_07.tif'
    'AT3_1m4_08.tif'
    'AT3_1m4_09.tif'
    'AT3_1m4_10.tif'

いずれかのイメージを表示します。

I = imread(fileNames{1});
imshow(I)
text(size(I,2),size(I,1)+15, ...
    'Image files courtesy of Alan Partin', ...
    'FontSize',7,'HorizontalAlignment','right');
text(size(I,2),size(I,1)+25, ...
    'Johns Hopkins University', ...
    'FontSize',7,'HorizontalAlignment','right');

各イメージに使用する画像処理アルゴアリズムの定義

イメージ内の非接触細胞を区分化する画像処理関数を作成します。いずれかのイメージで関数をテストします。

segmentedCells = batchDetectCells(I);
figure, imshow(segmentedCells)

batchDetectCells を表示するには、次のコマンドを使用します。

type batchDetectCells
function segmentedCells = batchDetectCells(I)
%batchDetectCells Algorithm to detect cells in image.
%   segmentedCells = batchDetectCells(I) detects cells in the cell
%   image I and returns the result in segmentedCells.
%
%   Supports batch processing example, ipexbatch. 

%   Copyright 2005-2012 The MathWorks, Inc.

% Use |edge| and the Sobel operator to calculate the threshold
% value. Tune the threshold value and use |edge| again to obtain a
% binary mask that contains the segmented cell.
[~, threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BW = edge(I,'sobel', threshold * fudgeFactor);

se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWdilate = imdilate(BW, [se90 se0]);
BWnobord = imclearborder(BWdilate, 4);
BWopen = bwareaopen(BWnobord,200);
BWclose = bwmorph(BWopen,'close');
BWfill = imfill(BWclose, 'holes');
BWoutline = bwperim(BWfill);
segmentedCells = I;
segmentedCells(BWoutline) = 255;

イメージのループ

関数 batchProcessFilesparfor を使用して各イメージを個別に処理します。この関数は通常の for ループと同様に機能しますが、以下に説明する Parallel Computing Toolbox ソフトウェアがある場合は、複数のプロセッサを利用できます。

batchProcessFiles を表示するには、次のコマンドを使用します。

type batchProcessFiles
function segmentedCellSequence = batchProcessFiles(fileNames,fcn)
%batchProcessFiles Process image files.
%   SEQUENCE = batchProcessFiles(FILENAMES,FCN) loops over all the files
%   listed in FILENAMES, calls the function FCN on each of them, and combines
%   the results in SEQUENCE. FCN is a function handle for a function with
%   signature: B = FCN(A).
%
%   Supports batch processing example, ipexbatch.

%   Copyright 2007-2012 The MathWorks, Inc.

I = imread(fileNames{1});

[mrows,ncols] = size(I);
nImages = length(fileNames);

segmentedCellSequence = zeros(mrows,ncols,nImages,class(I));

parfor (k = 1:nImages)    

    I = imread(fileNames{k});
    segmentedCellSequence(:,:,k) = fcn(I);    
    
end

Parallel Computing Toolbox ソフトウェアをインストールしている場合、ローカル ワーカーを使用し各サイクルをループを介して別のワーカーに配布できます。MATLAB Distributed Computing Server™ もインストールされている場合は、クラスターでバッチ処理ジョブを実行できます。

次のコマンドを使用して、既定の並列プロファイルからワーカーを使用できます。

pool = parpool

ここで batchProcessFiles を呼び出して、各ファイルにセル検出アルゴリズムを適用します。

segmentedCellSequence = batchProcessFiles(fileNames,@batchDetectCells);
Starting parallel pool (parpool) using the 'local' profile ... connected to 12 workers.

クリーン アップ

parpool を呼び出して一部のワーカーを起動した場合は、不要になったワーカーを必ず閉じてください。

delete(pool);

結果の表示

次のコマンドを実行して implay のシーケンスを表示します。

implay(segmentedCellSequence)

データがメモリ内に収まらない場合は、区分化されたイメージ データを 1 つの大きな配列に返す代わりに、parfor ループの本体を batchProcessFiles.m で修正し、区分化された各イメージを新しいファイルに書き込むか、または区分化されたシーケンス全体をマルチメディア ファイルに 1 イメージずつ書き込むことができます。そのため、処理とは別に結果を表示できます。

この情報は役に立ちましたか?