主要内容

用MapReduce计算图像的最大平均HSV

这个例子展示了如何使用ImageDatastore而且mapreduce在图像集合中查找具有最大色相、饱和度和亮度值的图像。

准备数据

中的映像创建一个数据存储工具箱/ matlab /演示而且工具箱/ matlab / imagesci.所选图像具有扩展名jpg.tif而且. png

demoFolder = fullfile(matlabroot,“工具箱”matlab的“演示”);imsciFolder = fullfile(matlabroot,“工具箱”matlab的“imagesci”);

使用文件夹路径创建数据存储,并使用FileExtensions名称-值对。

ds = imageDatastore({demoFolder, imsciFolder},...“FileExtensions”, {“jpg”“.tif”“使用”});

从所有图像中查找平均最大HSV

在图像集合中找到最大平均色相、饱和度和亮度值的一种方法是使用readimage在for循环中,一次处理一个图像。有关此方法的示例,请参见读取和分析图像文件

此示例使用mapreduce然而,要完成同样的任务,需要mapreduce方法可高度扩展到更大的图像集合。虽然for循环方法适用于小的图像集合,但它不能很好地扩展到大的图像集合。

缩放到MapReduce

  • mapreduce函数需要一个map函数和一个reduce函数作为输入。

  • map函数接收数据块并输出中间结果。

  • reduce函数读取中间结果并产生最终结果。

Map函数

  • 在本例中,map函数将图像数据和平均HSV值作为中间值存储。

  • 中间值与3个键相关,的平均色调的“平均饱和度”而且的平均亮度的

函数hueSaturationValueMapper(data, info, intermKVStore)如果~ismatrix(data) HSV = rgb2hsv(data);%提取色相值H = hsv(:,:,1);提取饱和度S = hsv(:,:,2);提取亮度值V = hsv(:,:,3);找出HSV值的平均值avgH =均值(h(:));avgS =均值(s(:));avgV =均值(v(:));添加中间键值对添加(intermKVStore的平均色调的结构(“文件名”,信息。文件名,“平均”avgH));添加(intermKVStore“平均饱和度”结构(“文件名”,信息。文件名,“平均”avg));添加(intermKVStore的平均亮度的结构(“文件名”,信息。文件名,“平均”avgV));结束结束

Reduce函数

  • reduce函数接收图像文件名列表以及各自的平均HSV值,并查找平均色相、饱和度和亮度值的整体最大值。

  • mapreduce只调用reduce函数3次,因为map函数只添加3个惟一键。

  • reduce函数使用添加向输出中添加最终的键值对。例如,“最大平均色相”是键,对应的文件名是值。

函数hueSaturationValueReducer(key, intermValIter, outKVSTore) maxAvg = 0;maxImageFilename =循环遍历每个键的值hasnext(intermValIter) value = getnext(intermValIter);比较值以确定最大值如果价值。平均> maxAvg maxAvg = value.Avg;maxImageFilename = value.Filename;结束结束%添加最终键值对add (outKVSTore, (“最大”例子),maxImageFilename);结束

MapReduce运行

使用mapreduce要将map和reduce函数应用到数据存储,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.使用找到而且比较字符串方法查找文件索引文件财产。

tbl = readall(maxHSV);I = 1:高度(tbl)图;Idx = find(strcmp(ds.))文件,tbl.Value{i})); imshow(readimage(ds, idx),“InitialMagnification”“健康”);标题(tbl.Key{我});结束

本地函数

这里列出的是map和reduce函数mapreduce适用于数据。

函数hueSaturationValueMapper(data, info, intermKVStore)如果~ismatrix(data) HSV = rgb2hsv(data);%提取色相值H = hsv(:,:,1);提取饱和度S = hsv(:,:,2);提取亮度值V = hsv(:,:,3);找出HSV值的平均值avgH =均值(h(:));avgS =均值(s(:));avgV =均值(v(:));添加中间键值对添加(intermKVStore的平均色调的结构(“文件名”,信息。文件名,“平均”avgH));添加(intermKVStore“平均饱和度”结构(“文件名”,信息。文件名,“平均”avg));添加(intermKVStore的平均亮度的结构(“文件名”,信息。文件名,“平均”avgV));结束结束%------------------------------------------------------------------------------------------函数hueSaturationValueReducer(key, intermValIter, outKVSTore) maxAvg = 0;maxImageFilename =循环遍历每个键的值hasnext(intermValIter) value = getnext(intermValIter);比较值以确定最大值如果价值。平均> maxAvg maxAvg = value.Avg;maxImageFilename = value.Filename;结束结束%添加最终键值对add (outKVSTore, (“最大”例子),maxImageFilename);结束%------------------------------------------------------------------------------------------

另请参阅

||

相关的话题