R - как найти элементы изображения внутри маски во временном ряду изображений? - PullRequest
0 голосов
/ 04 июля 2018

My R скрипт загружает 4-мерный набор данных, который представляет собой временной ряд 3D медицинских изображений. Я использую временной ряд, чтобы создать маску для исключения вокселей (трехмерных пикселей), которые имеют значение 0 в каждый момент времени:

voxels[is.na(voxels)]=0;             # just get rid of unusable data
mask=rowSums(voxels,dims=3);         # 3D image that is the sum over time
mask=(mask!=0);                      # make binary

Итак, чтобы найти значения для каждой временной точки по индексам внутри маски, которую я хочу сделать:

indices=which(mask!=0);              # find the positions of nonzeroes in the mask
voxelsfound=voxels[indices];         # find the values in the images at those positions

но это дает

 > length(indices)
 [1] 20483
 > length(voxelsfound)
 [1] 20483

так что результат только для первого момента времени. Есть ли подобный способ сформулировать это так, чтобы он возвращал и другие моменты времени (моя идея была voxelsfound=voxels[indices,], но это не сработало), или это возможно только с помощью цикла for или аналогичного?

В Python я бы сделал что-то подобное (используя m для mask и v для voxels), используя функцию nonzero для непосредственного доступа к индексам:

m = m.reshape(np.prod(m.shape));    
v = v.reshape(np.prod(m.shape),v.shape[3]);
v = v[:,np.nonzero(m)].squeeze(); 

1 Ответ

0 голосов
/ 05 июля 2018

Я считаю, что вы ищете:

mask <- which(rowSums(voxels, dims=3) != 0, arr.ind=T)
apply(voxels, 4, `[`, mask)
...