와 조건은 입력이 정수를 포함한 배열의 3x3x3하고 이웃을 기반으로, 그들은 제로 경우, 각각에 대한 교체 속도 최대 루프와 R
R.
이 코드를 속도를 번호.출력은 새로운 값을 갖는 배열 "mask_roi"입니다.
###### Start here
list_neig = array(0, dim = c(3,3,3))
mask_roi = array(sample(c(0,1,2),27,replace=T), dim = c(3,3,3))
values_mask = array(1:27, dim = c(3,3,3))
values_mask_melted = melt(values_mask, varnames=c("x","y","z"))
### Tranform the 3D Matrix in a data.table wit 4 columns position and value
image_melted <- melt(mask_roi, varnames=c("x","y","z")) # 4 columns: x, y, z, value
image_melted$box = rownames(image_melted)
image_melted_non_zeros<-image_melted[!(image_melted$value==0),]
box_neigbors = vector("list", nrow(image_melted))
for (i in 1:(nrow(image_melted_non_zeros))){
cat(i,"\n")
x = image_melted_non_zeros[i,1]
y = image_melted_non_zeros[i,2]
z = image_melted_non_zeros[i,3]
box_neigbors[[image_melted_non_zeros[i,5]]] <- list(nearestNeighbors(values_mask, elem = c(x,y,z), dist = 1,dim = c(3,3,3)))
}
내가
이 수행 한 "box_neighbors"벡터, 단지 그것을 활용하는 방법을 보여주기 위해 여기에 포함이, 우리는 빨리 여기 끝에서 확인해야합니다. 아이디어는 제로의 다른 모든 복셀을 확인하고 모든 이웃을 확인합니다. 그의 이웃이 0이면 동일한 가치를 지니고 그렇지 않으면 0을 유지합니다.for (i in 1:(nrow(image_melted_non_zeros))){
cat(i,"\n")
x = image_melted_non_zeros[i,1]
y = image_melted_non_zeros[i,2]
z = image_melted_non_zeros[i,3]
number_of_nei = length(box_neigbors[[image_melted_non_zeros[i,5]]][[1]])
value_vozel = mask_roi[x,y,z] # it will give this new value
for (j in 1:number_of_nei){
nei_number = box_neigbors[[image_melted_non_zeros[i,5]]][[1]][j]
xx = image_melted[nei_number,1]
yy = image_melted[nei_number,2]
zz = image_melted[nei_number,3]
value_nei = mask_roi[xx,yy,zz]
if(value_nei == 0){
mask_roi[xx,yy,zz] = value_vozel
}
}
}
3x3x3이 아닌 256x256x256 배열에이 작업을 수행해야합니다.
고맙습니다.
nearestNeighbors <- function(ary, elem, dist, dims){
usedims <- mapply(function(el, d) {
seq(max(1, el - dist), min(d, el + dist))
}, elem, dims, SIMPLIFY=FALSE)
df <- as.matrix(do.call('expand.grid', usedims))
ndist <- sqrt(apply(df, 1, function(x) sum((x - elem)^2)))
ret <- df[which(ndist > 0 & ndist <= dist),,drop = FALSE]
return(ary[ret])
}
어떤 패키지가 '녹아들'니까? –
@BryanGoggin,'melt'는'reshape'에서 유래했습니다. – Qaswed
이 @ r2evans에서 나를 도울 수 있겠습니까? 당신은 그 사람입니다! – DemetriusRPaula