1

drawRectマトリックス上に長方形を描画する関数がありますn x m x 3(カラーチャネルごとに1つのレイヤー)。

長方形パラメータc(xleft, xright, ytop, ybottom)と画像行列の2つの主要なパラメータを取ります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)
}

関数は想定どおりに機能します。ただし、画像に最大2000個の長方形を描画しようとしてい3400 x 5200 x 3ますが、これが非常に遅くなります。

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関数を使用して読み込まれ、関数を使用してファイルに書き込まれることに注意してください。jpegwriteJPEG


編集:長方形パラメーターのマトリックスを渡し、apply関数を使用して関数の複数の呼び出しを回避しようとしましたが、それでも大きな改善はありません。

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 に答える