В этом примере показано, как использовать ImageDatastore и mapreduce поиск изображений с максимальными значениями оттенка, насыщенности и яркости в коллекции изображений.
Создание хранилища данных с использованием изображений в toolbox/matlab/demos и toolbox/matlab/imagesci. Выбранные изображения имеют расширения .jpg, .tif и .png.
demoFolder = fullfile(matlabroot, 'toolbox', 'matlab', 'demos'); imsciFolder = fullfile(matlabroot, 'toolbox', 'matlab', 'imagesci');
Создание хранилища данных с использованием путей к папкам и фильтрация изображений, включенных в хранилище данных, с помощью FileExtensions Пара Наименование (Name) - Значение (Value).
ds = imageDatastore({demoFolder, imsciFolder}, ...
'FileExtensions', {'.jpg', '.tif', '.png'});Один из способов найти максимальное среднее значение оттенка, насыщенности и яркости в коллекции изображений - использовать readimage в цикле for, обрабатывая изображения по одному за раз. Пример этого метода см. в разделе Чтение и анализ файлов изображений.
В этом примере используется mapreduce для выполнения той же задачи, однако, mapreduce способ является высокомасштабируемым для больших коллекций изображений. Хотя метод for-loop приемлем для небольших коллекций изображений, он плохо масштабируется для большой коллекции изображений.
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 для применения карты и сокращения функций к хранилищу данных, 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 возвращает хранилище данных, maxHSV, с файлами в текущей папке.
Считывание и отображение окончательного результата из хранилища выходных данных, 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



Здесь перечислены функции карты и сокращения, которые 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 %------------------------------------------------------------------------------------------
imageDatastore | mapreduce | tall