Этот пример показывает, как использовать 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'});
Один способ найти максимальный средний оттенок, насыщение и значения яркости в наборе изображений состоит в том, чтобы использовать readimage
в цикле for, обрабатывая изображения по одному. Для примера этого метода смотрите Рида и Анализ файлов изображений.
Этот пример использует mapreduce
, чтобы выполнить ту же задачу, однако, метод mapreduce
является хорошо масштабируемым к большим наборам изображений. В то время как метод цикла for разумен для небольших коллекций изображений, он не масштабируется хорошо к большому количеству изображений.
Функция 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
, чтобы применить 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
datastore
| imageDatastore
| mapreduce
| tall