Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用函数的有效rbind方案_R_Image Processing - Fatal编程技术网

应用函数的有效rbind方案

应用函数的有效rbind方案,r,image-processing,R,Image Processing,退一步说,我的最终目标是将大约130000张图像读入像素大小为HxW的R中,然后制作一个数据帧/数据表,其中包含新行中每个图像的每个像素的rgb。因此,输出将如下所示: > head(train_data, 10) image_no r g b pixel_no 1: 00003e153.jpg 0.11764706 0.1921569 0.3098039 1 2: 00003e153.jpg 0

退一步说,我的最终目标是将大约130000张图像读入像素大小为HxW的R中,然后制作一个数据帧/数据表,其中包含新行中每个图像的每个像素的rgb。因此,输出将如下所示:

    > head(train_data, 10)
         image_no          r         g         b pixel_no
 1: 00003e153.jpg 0.11764706 0.1921569 0.3098039        1
 2: 00003e153.jpg 0.11372549 0.1882353 0.3058824        2
 3: 00003e153.jpg 0.10980392 0.1843137 0.3019608        3
 4: 00003e153.jpg 0.11764706 0.1921569 0.3098039        4
 5: 00003e153.jpg 0.12941176 0.2039216 0.3215686        5
 6: 00003e153.jpg 0.13333333 0.2078431 0.3254902        6
 7: 00003e153.jpg 0.12549020 0.2000000 0.3176471        7
 8: 00003e153.jpg 0.11764706 0.1921569 0.3098039        8
 9: 00003e153.jpg 0.09803922 0.1725490 0.2901961        9
10: 00003e153.jpg 0.11372549 0.1882353 0.3058824       10
> head(train, 10)
                               link
1  C:/Documents/image/00003e153.jpg
2  C:/Documents/image/000155de5.jpg
3  C:/Documents/image/00021ddc3.jpg
4  C:/Documents/image/0002756f7.jpg
5  C:/Documents/image/0002d0f32.jpg
6  C:/Documents/image/000303d4d.jpg
7  C:/Documents/image/00031f145.jpg
8  C:/Documents/image/00053c6ba.jpg
9  C:/Documents/image/00057a50d.jpg
10 C:/Documents/image/0005d01c8.jpg
do.call(rbind, lapply(df$a, MyFun))
我目前有一段代码可以实现这一点,其中我应用了一个函数来获取指定图像的每个像素的rgb,并在数据帧中返回结果:

#function to get rgb from image file paths
get_rgb_table <- function(link){

  img <- readJPEG(toString(link))

  # Creating the data frame
  rgb_image <- data.frame(r = as.vector(img[1:H, 1:W, 1]),
                          g = as.vector(img[1:H, 1:W, 2]),
                          b = as.vector(img[1:H, 1:W, 3]))
  #add pixel id
  rgb_image$pixel_no <- row.names(rgb_image)

  #add image id
  train_rgb <- cbind(sub('.*/', '',link),rgb_image)
  colnames(train_rgb)[1] <- "image_no"
  return(train_rgb)
}
我最终通过以下循环得到了我想要的结果:

for(i in 1:length(train[,1])){
  train_data <- rbind(train_data,get_rgb_table(train[i,1]))
}

然而,这最后一段代码效率很低。优化函数的应用方式和/或rbind将有所帮助。我认为函数get_rgb_table本身很快,但问题在于循环和rbind。我尝试过使用apply,但无法在每一行上都这样做,并将结果放在一个数据帧中,而不会耗尽内存。这方面的任何帮助都会很好。谢谢

鉴于问题的模糊性,这很难回答,但我将举一个我认为你在问的问题的可复制的例子,并给出解决方案

假设我有一个返回数据帧的函数:

MyFun <- function(x)randu[1:x,]
从您的问题来看,似乎只有一列将用作输入。因此,我使用lappy将函数应用于此数据帧的每一行,然后使用do.call和rbind将结果绑定在一起,如下所示:

    > head(train_data, 10)
         image_no          r         g         b pixel_no
 1: 00003e153.jpg 0.11764706 0.1921569 0.3098039        1
 2: 00003e153.jpg 0.11372549 0.1882353 0.3058824        2
 3: 00003e153.jpg 0.10980392 0.1843137 0.3019608        3
 4: 00003e153.jpg 0.11764706 0.1921569 0.3098039        4
 5: 00003e153.jpg 0.12941176 0.2039216 0.3215686        5
 6: 00003e153.jpg 0.13333333 0.2078431 0.3254902        6
 7: 00003e153.jpg 0.12549020 0.2000000 0.3176471        7
 8: 00003e153.jpg 0.11764706 0.1921569 0.3098039        8
 9: 00003e153.jpg 0.09803922 0.1725490 0.2901961        9
10: 00003e153.jpg 0.11372549 0.1882353 0.3058824       10
> head(train, 10)
                               link
1  C:/Documents/image/00003e153.jpg
2  C:/Documents/image/000155de5.jpg
3  C:/Documents/image/00021ddc3.jpg
4  C:/Documents/image/0002756f7.jpg
5  C:/Documents/image/0002d0f32.jpg
6  C:/Documents/image/000303d4d.jpg
7  C:/Documents/image/00031f145.jpg
8  C:/Documents/image/00053c6ba.jpg
9  C:/Documents/image/00057a50d.jpg
10 C:/Documents/image/0005d01c8.jpg
do.call(rbind, lapply(df$a, MyFun))

你不会说你的函数做了什么,也不会说你的输入和输出数据是什么样子的。人们很难提供帮助。。您是在尝试只优化rbind部分还是同时对dataframe部分的每一行应用一个函数?data.table::rbindlist应该快得多,但这似乎是一个有问题的开始过程,在data.frame上循环,可能有更好的方法。我认为@avid_useR建议解释函数的作用,因为通常有比将函数应用于每一行更有效的解决方案。在R中增加内容通常是不好的,尤其是对于数据帧,因为它非常慢,内存效率也很低。如果您事先知道结果应该有多少行,您可以启动一个具有该大小的数据帧,并用循环生成的结果填充它。感谢您的建议,我也将尝试一下并查看!如果你能澄清反对票,我们将感谢建设性的批评。