Вычисление максимального среднего 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)
% Map function for the Hue Saturation Value MapReduce example.

% Copyright 1984-2015 The MathWorks, Inc.
    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)
% Reduce function for the Hue Saturation Value MapReduce example.

% Copyright 1984-2015 The MathWorks, Inc.

    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

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

| | |

Похожие темы