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

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

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

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

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

Создайте datastore с помощью путей к папкам и отфильтруйте, какие изображения включены в datastore с помощью FileExtensions Пара "имя-значение".

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

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

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

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

Шкала до MapReduce

  • The 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

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

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

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

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

Прочтите и отобразите конечный результат из выхода datastore, 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
%------------------------------------------------------------------------------------------

См. также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте