【问题标题】:Operation in a cell array元胞数组中的操作
【发布时间】:2013-04-29 02:54:26
【问题描述】:

下午好,

我有一个包含许多多波段图像的单元阵列(每个图像 6 个波段)。 我的多维数组称为“D”,有两列:第一列包含图像名称,第二列包含图像文件(包含行、带...)。首先,我想使用以下代码将其转换为双精度格式(现在是 uint16),但我收到以下错误“??? Error using ==> double Too many input arguments.”

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

【问题讨论】:

  • 我认为您混淆了单元格数组和多维数组这两个术语。您能否展示C 的一小部分(一两行就足够了,这些单元格中存储的任何内容)?
  • 是的,对不起!细胞阵列! ;)
  • 元胞数组中存储的内容不清楚,请举个例子
  • 在单元阵列的每一行,都有一个多波段图像。这是我创建的方式。文件名 = dir(fullfile(myPath, '*.tif')); C = 单元格(长度(文件名),1); C = 单元格(长度(文件名),2);对于 k = 1:length(fileNames) 文件名 = fileNames(k).name; C{k} = imread(文件名); C{k, 1} = 文件名; C{k, 2} = imread(文件名);结束
  • 我在问题中包含了您的评论(稍作修改)

标签: matlab


【解决方案1】:

我相信你可以像这样实现你所需要的:

% 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)

这使用匿名函数一步完成您想要的转换和乘法。第三个参数周围的bsxfunpermute 是沿元胞数组Cdata 的每个元素的第三维应用向量a 的乘法。结果是一个与Cdata 大小相同的元胞数组。

【讨论】:

  • Wakjah,谢谢!我正在尝试,但收到以下错误(但我正在尝试解决它!):“>> output = cell(length(fileNames, 1)); ??? Error using ==> length Too many input论据。”
  • 哇,太棒了!非常感谢! :)
  • 修复了您收到的错误问题。缺少括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多