0

こんにちは、

多くのマルチバンド画像 (画像ごとに 6 バンド) を含む cell 配列があります。私の多次元配列は「D」と呼ばれ、2 つの列があります。最初の列は画像の名前で、2 番目の列は画像ファイル (行、バンド...) です。まず、以下のコードで double 形式 (現在は 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 

でも、それをどう表現したらいいのかわからない。事前に本当にありがとう


cell 配列の各行には、マルチバンド イメージがあります。これは私が作成した方法です:

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
4

1 に答える 1

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

次を使用して、1行で同じことを行うこともできます

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

これは、無名関数を使用して、必要な変換と乗算を 1 つのステップで実行します。3 番目の引数bsxfunの前後にあるは、 cell 配列 の各要素の 3 番目の次元に沿ってpermutevector の乗算を適用することです。結果は と同じサイズの cell 配列になります。aCdataCdata

于 2013-04-28T17:30:05.987 に答える