1

我有一个函数drawRect可以在矩阵上绘制一个矩形n x m x 3(每个颜色通道一层)。

它接受两个主要参数:矩形参数c(xleft, xright, ytop, ybottom)和图像矩阵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 个矩形,这就是它变得非常缓慢的地方。

我有一个2000 x 4矩形参数矩阵,看起来像:

#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
...

关于如何加快速度的任何想法?...

请注意,我的图像是使用包的功能读取的,并使用该readJPEG功能jpeg写入文件writeJPEG


编辑:我尝试传入矩形参数矩阵并使用应用函数来避免多次调用该函数,但仍然没有显着改进。

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)
}
4

1 回答 1

4

我不知道是否有矢量化版本,rect但您可以使用poylygon哪个是矢量化的。您只需要在矩形之间添加 NA 即可。这个答案的灵感来自这里的优秀答案。

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 个矩形。

在此处输入图像描述

于 2013-03-26T02:26:25.967 回答