2016-06-11 30 views
2

画像の各ピクセルをデータフレームの変数に変換するソリューションを探しています。ピクセルマトリクスを変数(データフレーム)に変換するR

解像度が320x280pxの~2500の入力イメージがあり、readJPEG()でマトリックスに読み込まれます。ファイル名には、後で分類する必要のある変数に関する情報が含まれています。

file_list <- list.files("D:/path/to/images", full.names=TRUE) 
# Extract person number and eye position from file names 
file_names <- sapply(strsplit(file_list, split = '/'), "[", 8) 
person_list <- substr(file_names, 1 ,3) 
person_class <- as.factor(person_list) 

# Read pixel matrices from image files 
pixelMatrices = lapply(X=file_list, FUN= function(x) readJPEG(file_list)) 
entryCount <- length(file_list) 

# Setting up a proper data set 
eyes = data.frame(pos= numeric(entryCount)) 
eyes$person <- person_class 
eyes$pixels <- pixelMatrices 

この結果、各オブジェクトは2つの変数(人物、ピクセル)を持つデータフレームになります。しかし、私は320 * 280 + 1の変数を持つデータフレームを持っていると思います。各ピクセルとファクタークラスに1つ。

は私が行列

test <- as.data.frame(x = unlist(pixelMatrices[1])) 
test <- unlist(pixelMatrices[1]) 
test <- as.data.frame(pixelMatrices[1]) 

をunlistingが、非適切な結果を与えるように異なるアプローチを試してみました。私が持っている唯一の(ほぼ)作業のアプローチは、これまでのすべてのピクセルをループし、次のようになり、データセットに行で行を挿入するためのものである:ループの

count <- length(file_list) 
imageWidth = 320; 
imageHeight = 280; 
variableCount = imageHeight * imageWidth + 1 

images <- as.data.frame(matrix(seq(count),nrow=count,ncol=variableCount)) 
images[1] <- eyes$person 
for(i in 1:count) { 
    img <- readJPEG(file_list[i]) 
    image <- c(img) 
    images[i, 2:variableCount] <- image 
} 

しかし、非常に遅いです。だから、〜2500 objで結果のデータフレームを得るための最良のアプローチは何ですか? 89601変数の?

答えて

1

でマトリクスを平坦化することを検討し、person_classをpixelMatricesの対応する変換済みデータフレームに繰り返し追加します。次に、最後のデータフレームにバインドするためにdo.call()を実行します。 Mapplyはperson_class内の各要素は、接続された行列に並ぶことが保証されます:

combinedata <- function(x,y){ 
        # FLATTEN MATRIX AND TRANSPOSE ACROSS MANY COLUMNS 
        temp <- data.frame(t(as.vector(x))) 
        temp$person_class <- y 
        return(temp) 
       } 

# WIDE LIST 
dfList <- mapply(combinedata, pixelMatrices, person_class) 

# LONG LIST CONVERSION FOR DO.CALL() 
dfList <- lapply(1:entryCount, function(i) data.frame(dfList[,i])) 

# ROW BIND UNDERLYING DATA FRAMES 
finaldf <- do.call(rbind, dfList) 
+0

Iあなたのアプローチを使用してみましたが、私のRStudioが計算行の数分後に私は次のエラーを与えた 'dfList < - mapply(combineDataと、pixelMatrices、person_class) ':R Session Aborted、Rに致命的なエラーが発生しました。セッションが終了しました。 – 4ndro1d

+0

多くの列がなぜ必要なのか尋ねることはできますか?行列を平坦化せずにdfsに変換し、各行に対してperson_classを繰り返すのはなぜですか? – Parfait

+0

その後、最も重要な機能を見つけるためにPCAを使用したいと考えています。モデルを訓練するために複数のデータフレームをどのように使用するかはわかりません。私はRの初心者であり、noobのチュートリアルがないのでかなり制限されていると感じている – 4ndro1d

関連する問題