Применить 2D-карту к 3D-массиву в MATLAB - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть трехмерный массив произвольного размера m x n x d, где d - это размер, в данном случае, момент времени. У меня есть 2D-маска размера m x n, которую я хочу применить к 3D-стеку, и в каждом случае, когда маска имеет значение 1, для установки значения соответствующего индекса в стеке на nan. Пока я делаю это так:

imageStack((mask == 1)) = nan;

Однако при отображении изображения из одного измерения в стеке, т.е. imagesc(imageStack(:,:,1) после процесса, становится ясно, что маска была применена. Однако к более высоким измерениям эта маска не применяется - кажется, она применила ее только к первому измерению, а не ко всему стеку изображений. Я что-то упустил в своей реализации маски?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы также можете использовать repmat для трансляции своей маски в 3-е измерение:

d=size(imageStack,3);
imageStack(repmat(mask==1,[1,1,d]))=nan;
0 голосов
/ 05 сентября 2018

Сначала создайте маску с NaNs, чтобы упростить работу. Ваша маска может работать, но вы не поделились ею.

masknan=mask==1; masknan(masknan)=nan;

Тогда, если вы находитесь в версии 2016b или новее, вы можете использовать для задания неявное расширение.

image=imageStack.*masknan; % it will automatically broadcast to the 3rd dimension

В противном случае используйте bsxfun

image=bsxfun(@times,imageStack,masknan);
...