2013-03-26 2 views
1

n x m x 3 행렬 (각 색상 채널에 대해 하나의 레이어)에 직사각형을 그리는 기능이 drawRect입니다.이미지 행렬에 직사각형을 그리는 효율 R

은 2 개 개의 주요 파라미터 취 c(xleft, xright, ytop, ybottom) PARAMS 사각형 및 가정에으로서의 기능이 작동 화상 매트릭스 im

drawRect <- function(rect, im, color=2){ 
    int = 255 
    im[rect[3]:rect[4],rect[1],color] = int 
    im[rect[3]:rect[4],rect[2],color] = int 
    im[rect[3],rect[1]:rect[2],color] = int 
    im[rect[4],rect[1]:rect[2],color] = int 
    return(im) 
} 

한다. 그러나, 나는 3400 x 5200 x 3 이미지에 ~ 2000 개의 직사각형을 그리려하고 있는데, 이것은 매우 느리게됩니다. 내 이미지가를 사용하여 읽기이 속도를하는 방법에 어떤 아이디어

#xleft xright ytop ybottom 
313 413 143  243 
413 513 143  243 
513 613 143  243 
613 713 143  243 
713 813 143  243 
811 911 143  243 
... 

...

참고 :

내가 좋아하는 뭔가를 보이는 사각형 매개 변수의 2000 x 4 행렬이 readJPEGjpeg 패키지의 기능이며 writeJPEG 기능을 사용하여 파일에 기록됩니다.


편집 : 사각형 PARAMS의 행렬에 전달하고 함수의 여러 호출을 피하기 위해 적용 기능을 사용하여 시도,하지만 여전히 상당한 개선했습니다.

drawRect2 <- function(rects, im, color=2, int = 255){ 

    x=apply(rects, 1, function(rect){ 
     im[rect[3]:rect[4],rect[1],color] = int 
     im[rect[3]:rect[4],rect[2],color] = int 
     im[rect[3],rect[1]:rect[2],color] = int 
     im[rect[4],rect[1]:rect[2],color] = int 
    }) 

    return(im) 
} 
+0

그럼 내가 훨씬 적용하지만 didnt 한 도움에 포장 시도 ... 정말 함수에 많이하지를 프로그래머. 필기 부분은 저에게 관심사가 아닙니다. 그것은 꽤 빨리 씁니다. – by0

+0

함수가 매우 느린 이유는 배열을 수정하려면 함수 내에서 복사해야하기 때문입니다. 그래서 당신이 그 함수를 호출 할 때마다, R은 아마 적어도 전체 배열의 복사본 하나를 생성하고있을 것입니다. – joran

+0

함수에 대한 다중 호출을 피하기 위해 적용 함수에서이를 래핑하려고했습니다. 여전히 중요한 개선점은 (편집 참조) – by0

답변

4

rect의 벡터화 버전이 있는지 모르겠어요하지만 당신은 벡터화 poylygon를 사용할 수 있습니다. 직사각형 사이에 NA를 추가하기 만하면됩니다. 이 대답은 우수 답변 here에서 영감을 얻었습니다.

cuts <- function(x) 
{ 
    n <- length(x) %/% 4 
    map <- rep(c(rep(TRUE,4),FALSE), n) 
    result <- rep(NA, n*5) 
    result[map] <- x 
    result 
} 


n <- 2000 

xbottom <- runif(n) 
ybottom <- runif(n) 
xtop <- xbottom+runif(n) 
ytop <- ybottom+runif(n) 

x <- cbind(xbottom,xbottom,xtop,xtop) 
y <- cbind(ybottom,ytop,ytop,ybottom) 
cols <- heat.colors(n)[order(x[,1])] 
plot(0, xlim=c(min(x),max(x)), ylim=c(min(y),max(y))) 
polygon(x=cuts(t(x)), y=cuts(t(y)), col=cols) 

이렇게하면 2000 개의 직사각형이 순간적으로 생성됩니다.

enter image description here