Вычисление максимального среднего 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

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

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

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

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

Перечисленный здесь 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
%------------------------------------------------------------------------------------------

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

| |

Похожие темы