Матрица MATLAB 3D, максимум в разных направлениях + вращение с использованием MIP - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть трехмерное изображение с именем img, скажем, это массив 291x287x801 int16. Я использую MIP (проекция максимальной интенсивности), чтобы найти изображение с максимальной интенсивностью в разных направлениях. Я знаю, что могу использовать max, чтобы получить MIP:

MIPimg=max(img,[],3);
imagesc(MIPimg);

Однако это не дает мне правильного направления. Я думаю, что это вдоль направления z, но что мне делать, если я хочу найти MIP вдоль направления y или x?

Я пытался изменить значение 3, указывающее размерность, на 1 или 2, но MATLAB сообщает мне

Ошибка при использовании изображения
Данные о цвете должны быть m-by-n -бай-3 или матрица m-на-n.

при вызове imagesc(MIPimg).

Я также пытался MIPimg=max(img,[ ],[2 3]);, но это не помогло.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Ваша проблема в том, что imagesc ожидает либо 2D-массив в качестве входных данных, либо 3D-массив, в котором 3-е измерение имеет ровно 3 значения (именно так MATLAB представляет RGB-изображение). Когда вы делаете max(img,[],1), вы получаете обратно массив 1x287x801, который имеет 801 элемент по 3-му измерению, а не 3, как ожидает MATLAB.

Для отображения вам нужно преобразовать этот массив 1x287x801 в Массив 287x801. Функция squeeze делает это (удаляет все размеры размером 1):

MIPimg = squeeze(max(img,[],1));
1 голос
/ 03 апреля 2020

Я не могу воспроизвести вашу проблему:

% create random 3D-unit8-matrix (to mimic an image)
img = uint8(randi(255,10,12,3)); % 10x12x3 matrix
% maximum over all rows (direction 1) of each of the 3 10x12 matrices => returns 3 1x12 arrays
[val,idx] = max(img,[],1); % default direction
% maximum over all columns (direction 2) of each of the 3 10x12 matrices => returns 3 10x1 vectors
[val,idx] = max(img,[],2);
% maximum over all slices (direction 3) of each of the 10x12 1x3 "depth" arrays => returns a 10x12 matrix
[val,idx] = max(img,[],3);

общий максимум

max(max(max(img))) % no useful information about the position

позиция максимума:

[val_slc,idx_slc] = max(img,[],3); % I can better think in 2D
[val_row,idx_row] = max(val_slc);
[val_col,idx_col] = max(val_row);
idx_max = [idx_row(idx_col),idx_col,idx_slc(idx_row(idx_col),idx_col)];

проверка

assert( max(max(max(img))) == img(idx_max(1),idx_max(2),idx_max(3)) )
...