2010-10-19 3 views
2

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

Предположим, что матрицы MxN содержат только 0 и 1. Предположим, что изображения просто содержат белые линии на черном фоне (т. Е. Значение пикселя == 1, если этот пиксель является частью строки, 0 в противном случае). Предположим, что изображения упорядочены таким образом, чтобы предлагать движение вперед линий (линий) в последующих изображениях. Я хочу видеть «боковое представление» (или объемное представление) этих изображений, которое покажет поверхность, которую определенная линия «вырезает» в своем движении по изображениям.

Кодирование выполняется в MATLAB. Я посмотрел на plot (но это только 2D-графики) и surf, что делает 3D-графики, но не работает для моей матрицы изображений MxNx9. Я также попытался поэкспериментировать с contourslice, но не уверен, какие параметры передать его.

Спасибо!

Мария

ответ

2

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

Я вижу пару подходов.

Вы можете использовать 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. Или вы можете использовать обычный сюжет() и некоторую ручную прокрутку для построения траекторий всех контрольных точек или вершин в геометрических функциях.


EDIT: Вот вариант, который использует патч(), чтобы нарисовать каждый пиксель как маленький многоугольник, плавающий в пространстве на уровне 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 
+0

Сколько слоев хорошо написано в Matlab? Обычно я просто добавляю значения RGB для разных «слоев» в один массив mxnx3. – Jonas

+0

Я ищу 3D-представление своих 2D-изображений, где 3-е измерение представляет время. Мои изображения просто содержат строки (так что только возможные значения матрицы равны 0 и 1). Моя конечная цель - уметь отслеживать конкретную линию между изображениями и определять ее путь (или из какого образа оно возникло). Я надеялся использовать подход «соседних пикселей», чтобы увидеть, имеет ли изображение в последовательности одна и та же линия в соответствующем районе. Но сначала я хотел бы визуализировать свои данные. Поэтому запишите каждый образ MxN, где одно изображение является продолжением предыдущего со временем. Таким образом, получается участок поверхности. – Myx

+0

@ Джонас: зависит от размера и памяти сюжета; несколько десятков, прежде чем столкнуться с проблемами памяти для участков размером 500х500 в 2 ГБ оперативной памяти.Форма MxNx3 также должна работать нормально; пользователю просто нужно будет вычислить абсолютные значения цвета, где форма MxNx1 автоматически нормализуется к цветной карте фигуры. –

Смежные вопросы