用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);结束%------------------------------------------------------------------------------------------