メインコンテンツ

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

Figure contains an axes object. The hidden axes object with title Maximum Average Hue contains an object of type image.

Figure contains an axes object. The hidden axes object with title Maximum Average Saturation contains an object of type image.

Figure contains an axes object. The hidden axes object with title Maximum Average Brightness contains an object of type image.

参考

| |

トピック