【问题标题】:Matlab: Apply an operation to each element of matrixMatlab:对矩阵的每个元素应用运算
【发布时间】:2014-05-01 13:15:20
【问题描述】:
我有 100 个图像,我已经读取并存储在 形式的矩阵中,我想对每个图像应用一个操作。我能怎么做?
我有另一个 形式的矩阵,其中包含 800 个图像,我想做同样的事情,即对每个图像应用一个操作。
我不知道如何制作一个携带它的循环。谢谢你的帮助
【问题讨论】:
标签:
image
matlab
loops
matrix
cell
【解决方案1】:
假设你的函数是这种形式function imageOut = someFunction(imageIn):
第一种情况:(假设I 是一个MxNxP 矩阵,带有P 图像,每个MxN)
O = cell2mat(cellfun(@someFunction, num2cell(I, [1 2]), 'UniformOutput', false))
第二种情况:(假设I是MxN单元格数组,每个单元格包含一张图片)
O = cellfun(@someFunction, I, 'UniformOutput', false)
【解决方案2】:
最直接的方法是使用for-loop。
对于128-by-128-by-100 矩阵(我们称之为M),您可以这样做
for imi = 1:size(M,3)
currImg = M(:,:,imi); % take a "slice" of M = an image
% process currImg here...
end
对于40-by-20 元胞数组(我们称之为C),您可以这样做
for ri = 1:size(C,1)
for ci = 1:size(C,2)
currImg = C{ri,ci}; % get an image stored in cell ri,ci
% process currImg here...
end
end
注意访问矩阵(使用())和访问单元元素(使用{})的不同模式。
【解决方案3】:
这真的真的真的取决于您要应用的操作。例如,如果你想用 3x3 的正方形对每张图像进行扩张,你所要做的就是传递 3D 矩阵和 3x3 的正方形。
imdilate (img, true (3, 3));
这个简单的示例将对矩阵的所有 2D 图像应用膨胀,这完全取决于选择正确的结构元素(true (3, 3))。当然,您也可以使用 for 循环,但这不是该语言的本意。上面的例子不是比循环优雅得多吗?
一个为 Matlab 语言精心设计的函数应该为您处理这种情况,并在 n 维矩阵的所有图像上工作。由您来理解操作符并使其功能足够好,以使其做您想做的事情。