Matlab: как построить многомерный массив - PullRequest
2 голосов
/ 19 октября 2010

Допустим, у меня есть 9 MxN черно-белых изображений, которые каким-то образом связаны друг с другом (т.е. промежуток времени какого-либо события).Как я могу отобразить все эти изображения на одном графике поверхности?

Предположим, что матрицы MxN содержат только 0 и 1.Предположим, что изображения просто содержат белые линии на черном фоне (то есть значение пикселя == 1, если этот пиксель является частью линии, 0 в противном случае).Предположим, что изображения упорядочены таким образом, чтобы предлагать прогрессию движения линий на последующих изображениях.Я хочу иметь возможность видеть «боковой вид» (или объемное представление) этих изображений, который покажет поверхность, которую конкретная линия «вырезает» при движении по изображениям.в MATLAB.Я посмотрел на plot (но он делает только 2D-графики) и surf, который делает 3D-графики, но не работает для моей матрицы изображений MxNx9.Я также пытался поэкспериментировать с contourslice, но не уверен, какие параметры передать.

Спасибо!

Мария

1 Ответ

2 голосов
/ 20 октября 2010

Являются ли эти изображения черно-белыми с простыми функциями в «пустом» поле или в оттенках серого с более плотной информацией?

Я вижу несколько подходов.

Вы можете использоватьmovie () для отображения последовательности изображений в виде анимации.

Для статического представления разреженных, простых данных вы можете построить каждое изображение как отдельный слой на одном рисунке, давая каждому слою свой цвет дляпередний план и использование 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 не будет знать, какие "перемещенные" пиксели в двух последующих изображениях связаны с каждымДругой.Не думаете ли вы, что у вас есть базовые векторные данные для геометрических объектов на изображениях?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
...