下午好,
我有一个包含大量多波段图像的单元阵列(每个图像有6个波段)。 我的多维数组称为“D”,有两列:第一列是图像名称,第二列是图像文件(带行,带......)。首先,我想使用以下代码以双格式(现在是uint16)对其进行转换,但是我收到以下错误“???使用==>错误输出参数太多。”
D= double(C{:,1});
然后,我有这些价值观:
a1=1957
a2= 1900
a3= 1554
a4=1036
a5=215
a6=80
我正在尝试做的是创建一个循环(我正在简化问题),因为我需要在图像的每个波段上执行相同的操作。代码看起来像这样:
for k = 1:band(D{:,1})
band1= D(:,:,1);
band2= D(:,:,2);
...
band1*a1=output1
band2*a2=output2
end
但我真的不知道如何表达这一点。非常感谢提前
在单元阵列的每一行上,都有一个多波段图像。这就是我创造的方式:
fileNames = dir(fullfile(myPath, '*.tif'));
C = cell(length(fileNames), 2);
for k = 1:length(fileNames)
filename = fileNames(k).name;
C{k, 1} = filename;
C{k, 2} = imread(filename);
end
答案 0 :(得分:3)
我相信你可以实现你所需要的:
% Put your a in an array:
a = [1957 1900 1554 1036 215 80];
fileNames = dir(fullfile(myPath, '*.tif'));
C = cell(length(fileNames), 2);
% Allocate output as well
output = cell(length(fileNames), 1);
for k = 1:length(fileNames)
filename = fileNames(k).name;
C{k, 1} = filename;
imData = imread(filename);
C{k, 2} = imData;
% Loop over the bands and multiply
curOutput = zeros(size(imData));
for nBand = 1:size(imData, 3)
curOutput(:, :, nBand) = a(nBand) * double(imData(:, :, nBand));
end
% Store output
output{k} = curOutput;
% Note: The above loop over the bands can be replaced by
% output{k} = bsxfun(@times, double(imData), permute(a, [3 1 2]));
end
您也可以使用以下
在一行中执行相同的操作% After your loop...
Cdata = C(:, 2);
% OR:
%
% Generate some random data like yours (I think)
% Cdata = arrayfun(@(x){uint16((2 ^ 16 - 1) * rand(10, 10, 6))}, zeros(10, 1));
% Then do:
output = cellfun(@(x)bsxfun(@times, double(x), permute(a, [3 1 2])), Cdata, ...
'UniformOutput', false)
这使用匿名函数在一个步骤中执行所需的转换和乘法。围绕第三个参数的bsxfun
permute
是沿着单元格数组a
的每个元素的第三维应用向量Cdata
的乘法。结果是一个与Cdata
大小相同的单元格数组。