ドキュメンテーション

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

MapReduce によるイメージの最大平均 HSV の計算

この例では、ImageDatastoremapreduce を使用して、イメージ コレクション内で色相、彩度および明度の最大値をもつイメージを検出する方法を説明します。

データの準備

toolbox/matlab/demos および toolbox/matlab/imagesci 内のイメージを使用してデータ ストアを作成します。選択したイメージには、拡張子 .jpg.tif および .png が付いています。

demoFolder = fullfile(matlabroot, 'toolbox', 'matlab', 'demos');
imsciFolder = fullfile(matlabroot, 'toolbox', 'matlab', 'imagesci');

フォルダー パスを使用してデータ ストアを作成し、名前と値のペア FileExtensions を使用してデータ ストアに含まれるイメージをフィルター処理します。

ds = imageDatastore({demoFolder, imsciFolder}, ...
    'FileExtensions', {'.jpg', '.tif', '.png'});

すべてのイメージの平均最大 HSV の検出

イメージ コレクション内で色相、彩度および明度の最大平均値を検出する方法の 1 つに、for ループ内で readimage を使用してイメージを 1 つずつ処理する方法があります。この方法の例については、イメージ ファイルの読み取りおよび解析を参照してください。

次の例では、mapreduce を使用して同じタスクを実行しますが、mapreduce は、より大きなイメージのコレクションに対して高度な拡張性をもっています。for ループを使用する方法は、小さなイメージのコレクションには適切ですが、大きなイメージのコレクションに対する拡張性は十分ではありません。

MapReduce への拡張

  • 関数 mapreduce は、入力として map 関数と reduce 関数を必要とします。

  • map 関数はデータのチャンクを受け取って中間結果を出力します。

  • reduce 関数は中間結果を読み取って最終結果を生成します。

map 関数

  • 以下の例では、map 関数はイメージ データと平均 HSV 値を中間値として格納します。

  • 中間値は、3 つのキー 'Average Hue''Average Saturation' および 'Average Brightness' と関連付けられています。

function hueSaturationValueMapper(data, info, intermKVStore)
% Map function for the Hue Saturation Value MapReduce example.

% Copyright 1984-2015 The MathWorks, Inc.
    if ~ismatrix(data)
        hsv = rgb2hsv(data);

        % Extract Hue values
        h = hsv(:,:,1);

        % Extract Saturation values
        s = hsv(:,:,2);

        % Extract Brightness values
        v = hsv(:,:,3);

        % Find average of HSV values
        avgH = mean(h(:));
        avgS = mean(s(:));
        avgV = mean(v(:));

        % Add intermediate key-value pairs
        add(intermKVStore, 'Average Hue', struct('Filename', info.Filename, 'Avg', avgH));
        add(intermKVStore, 'Average Saturation', struct('Filename', info.Filename, 'Avg', avgS));
        add(intermKVStore, 'Average Brightness', struct('Filename', info.Filename, 'Avg', avgV));
    end
end

reduce 関数

  • reduce 関数はイメージ ファイル名の一覧を、それぞれの平均 HSV 値と共に受け取り、色相、彩度、明度の平均値の全体の最大値を検出します。

  • mapreduce は、map 関数が 3 つの一意のキーのみ追加するため、この reduce 関数を 3 回だけ呼び出します。

  • reduce 関数は、add を使用して最終的なキーと値のペアを出力に追加します。たとえば、'Maximum Average Hue' がキーであり、それぞれのファイル名が値です。

function hueSaturationValueReducer(key, intermValIter, outKVSTore)
% Reduce function for the Hue Saturation Value MapReduce example.

% Copyright 1984-2015 The MathWorks, Inc.

    maxAvg = 0;
    maxImageFilename = '';

    % Loop over values for each key
    while hasnext(intermValIter)
        value = getnext(intermValIter);

        % Compare values to determine maximum
        if value.Avg > maxAvg
            maxAvg = value.Avg;
            maxImageFilename = value.Filename;
        end

    end

    % Add final key-value pair
    add(outKVSTore, ['Maximum ' key], maxImageFilename);
end

mapreduce の実行

mapreduce を使用して、map 関数および reduce 関数をデータ ストア ds に適用します。

maxHSV = mapreduce(ds, @hueSaturationValueMapper, @hueSaturationValueReducer);
********************************
*      MAPREDUCE PROGRESS      *
********************************
Map   0% Reduce   0%
Map  12% Reduce   0%
Map  25% Reduce   0%
Map  37% Reduce   0%
Map  50% Reduce   0%
Map  62% Reduce   0%
Map  75% Reduce   0%
Map  87% Reduce   0%
Map 100% Reduce   0%
Map 100% Reduce  33%
Map 100% Reduce  67%
Map 100% Reduce 100%

mapreduce は、現在のフォルダー内のファイルでデータ ストア maxHSV を返します。

出力データ ストア maxHSV から最終結果を読み取り、表示します。findstrcmp を使用して、Files プロパティからファイル インデックスを検出します。

tbl = readall(maxHSV);
for i = 1:height(tbl)
    figure;
    idx = find(strcmp(ds.Files, tbl.Value{i}));
    imshow(readimage(ds, idx), 'InitialMagnification', 'fit');
    title(tbl.Key{i});
end

参考

| | |

関連するトピック