MapReduce によるイメージの最大平均 HSV の計算
この例では、ImageDatastore と mapreduce を使用して、イメージ コレクション内で色相、彩度および明度の最大値をもつイメージを検出する方法を説明します。
データの準備
現在のフォルダー内の複数のイメージを使用してデータストアを作成します。名前と値のペア 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 から最終結果を読み取り、表示します。find と strcmp を使用して、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



参考
mapreduce | imageDatastore | tall