Вычисление максимального среднего 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 разумен для небольших коллекций изображений, он не масштабируется хорошо к большому количеству изображений.

Масштабирование к 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 применять map и reduce функции к 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

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

Перечисленный здесь map и reduce функции что 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
%------------------------------------------------------------------------------------------

Смотрите также

| | |

Похожие темы