В этом примере показано, как использовать 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) 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
применять 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 %------------------------------------------------------------------------------------------
imageDatastore
| mapreduce
| tall