В этом примере показано, как использовать 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-loop разумен для небольших наборов изображений, он плохо масштабируется до большого набора изображений.
The mapreduce
функция требует функции map и функции reduce в качестве входов.
Функция map получает блоки данных и выводит промежуточные результаты.
Функция reduce считывает промежуточные результаты и приводит к конечному результату.
В этом примере функция map сохраняет данные изображения и средние значения 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 раза, поскольку функция map добавляет только три уникальных ключа.
Функция reduce использует 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
для применения карты и сокращения функций к 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
Вот карта и сокращение функций, которые 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