Main Content

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

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

データの準備

現在のフォルダー内の複数のイメージを使用してデータストアを作成します。名前と値のペア FileExtensions を使用して .jpg イメージのみを選択します。

ds = imageDatastore(pwd,'FileExtensions','.jpg');

すべてのイメージの平均最大 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)
  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)
  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  20% Reduce   0%
Map  40% Reduce   0%
Map  60% Reduce   0%
Map  80% 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

参考

| |

関連するトピック