2

何らかの形で互いに関連している 9 MxN の白黒画像があるとします (つまり、あるイベントのタイムラプス)。これらすべての画像を 1 つの表面プロットに表示するにはどうすればよいですか?

MxN 行列に 0 と 1 のみが含まれていると仮定します。画像には黒い背景に白い線が含まれているだけであると仮定します (つまり、ピクセルが線の一部である場合はピクセル値 == 1、そうでない場合は 0)。後続の画像で行の動きの進行を示唆するような方法で画像が順序付けられていると仮定します。これらの画像の「側面図」(または体積表現) を表示できるようにしたいと考えています。これは、特定の線が画像を横切る動きで「切り取る」表面を示します。

コーディングは MATLAB で行います。plot(ただし、2D プロットのみを行います) とを調べましたがsurf、これは 3D プロットを行いますが、画像の MxNx9 マトリックスでは機能しません。も試してみましたcontoursliceが、渡すパラメータがわかりません。

ありがとう!

まりや

4

1 に答える 1

2

これらの画像は、「空白」のフィールドに単純な機能を備えた白黒ですか、それともグレースケールで、より密な情報を備えていますか?

いくつかのアプローチを見ることができます。

movie() を使用して、一連の画像をアニメーションとして表示できます。

まばらで単純なデータの静的ビューの場合、各画像を 1 つの図の個別のレイヤーとしてプロットし、各レイヤーに前景に異なる色を与え、AlphaData を使用して背景を透明にして、シーケンスのすべてのステップが表示されるようにすることができます。終えた。色のグラデーションは、イメージ シーケンス内の位置に対応します。これが例です。

function plotImageSequence

% Made-up test data
nLayers = 9;
x = zeros(100,100,nLayers);
for i = 1:nLayers
    x(20+(3*i),:,i) = 1;
end

% Plot each image as a "layer", indicated by color
figure;
hold on;
for i = 1:nLayers
    layerData = x(:,:,i);
    alphaMask = layerData == 1;
    layerData(logical(layerData)) = i; % So each layer gets its own color
    image('CData',layerData,...
        'AlphaData',alphaMask,...
        'CDataMapping','scaled');
end
hold off

Matlab は、2 つの後続の画像のどの「移動」ピクセルが互いに関連付けられているかを認識できないため、「線」が切り開く移動経路を直接表示することはラスター データでは困難です。画像内の幾何学的特徴の基礎となるベクトル データがあると思いませんか? Plot3() を使用すると、時間を z 軸として、それらの動きを示すことができる場合があります。または、通常の plot() と手動操作を使用して、ジオメトリック フィーチャのすべてのコントロール ポイントまたは頂点のパスをプロットすることもできます。


編集: patch() を使用して各ピクセルを画像シーケンスのインデックスの Z レベルで空間に浮かぶ小さな多角形として描画するバリエーションを次に示します。これは、あなたが求めている「表面」スタイルのプロットに似ていると思います。FaceAlpha プロパティをいじって、高密度のプロットをより読みやすくすることができます。

function plotImageSequencePatch

% Made-up test data
nLayers = 6;
sz = [50 50];
img = zeros(sz(1),sz(2),nLayers);
for i = 1:nLayers
    img(20+(3*i),:,i) = 1;
end

% Plot each image as a "layer", indicated by color
% With each "pixel" as a separate patch
figure;
set(gca, 'XLim', [0 sz(1)]);
set(gca, 'YLim', [0 sz(2)]);
hold on;
for i = 1:nLayers
    layerData = img(:,:,i);
    [x,y] = find(layerData);  % X,Y of all pixels
    % Reshape in to patch outline
    x = x';
    y = y';
    patch_x = [x; x+1; x+1; x];
    patch_y = [y; y; y+1; y+1];
    patch_z = repmat(i, size(patch_x));

    patch(patch_x, patch_y, patch_z, i);
end
hold off
于 2010-10-19T20:30:12.540 に答える