exponenta event banner

Вычисление максимального среднего HSV изображений с помощью MapReduce

В этом примере показано, как использовать ImageDatastore и mapreduce поиск изображений с максимальными значениями оттенка, насыщенности и яркости в коллекции изображений.

Подготовка данных

Создание хранилища данных с использованием изображений в toolbox/matlab/demos и toolbox/matlab/imagesci. Выбранные изображения имеют расширения .jpg, .tif и .png.

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

Создание хранилища данных с использованием путей к папкам и фильтрация изображений, включенных в хранилище данных, с помощью FileExtensions Пара Наименование (Name) - Значение (Value).

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

Найти среднее максимальное значение HSV из всех изображений

Один из способов найти максимальное среднее значение оттенка, насыщенности и яркости в коллекции изображений - использовать readimage в цикле for, обрабатывая изображения по одному за раз. Пример этого метода см. в разделе Чтение и анализ файлов изображений.

В этом примере используется mapreduce для выполнения той же задачи, однако, mapreduce способ является высокомасштабируемым для больших коллекций изображений. Хотя метод for-loop приемлем для небольших коллекций изображений, он плохо масштабируется для большой коллекции изображений.

Масштабирование до MapReduce

  • mapreduce функция требует функции отображения и функции уменьшения в качестве входных данных.

  • Функция отображения принимает блоки данных и выводит промежуточные результаты.

  • Функция уменьшения считывает промежуточные результаты и дает окончательный результат.

Функция карты

  • В этом примере функция отображения сохраняет данные изображения и средние значения 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

Уменьшение функции

  • Функция уменьшения принимает список имен файлов изображения вместе с соответствующими средними значениями HSV и находит общие максимальные значения среднего оттенка, насыщенности и яркости.

  • mapreduce вызывает эту функцию уменьшения только в 3 раза, поскольку функция отображения добавляет только три уникальных ключа.

  • Использование функции сокращения 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 для применения карты и сокращения функций к хранилищу данных, 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. Использовать 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

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

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

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

Локальные функции

Здесь перечислены функции карты и сокращения, которые mapreduce относится к данным.

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
%------------------------------------------------------------------------------------------
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
%------------------------------------------------------------------------------------------

См. также

| |

Связанные темы