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