2016-03-04 26 views
10

Ich versuche, mit einigen Bilddaten in R zu arbeiten, und kann nicht herausfinden, wie die Größe der Bilder geändert werden muss, um sicherzustellen, dass sie alle die gleiche Größe haben.Bildgröße in R ändern

In Python, näherte ich dieses Problem wie folgt:

from PIL import Image 
import numpy as np 

size = (100, 100) 
img = Image.open(filename) 
img = img.resize(size) 
img = np.array(img.getdata()) 

In R, habe ich nicht in der Lage gewesen, eine Bibliothek zu finden, die das Gleiche erreichen würde. Der weiteste ich habe in der Lage zu bekommen, ist:

library(jpeg) 

img <- readJPEG(filename) 
# Need something here to resize 
img <- as.matrix(img) 

Der einfachste Ansatz wäre, eine Bibliothek wie Kissen, die ich nennen könnte, aber wie gesagt, ich kann nicht, etwas zu finden scheinen.

Danke,

Antwort

14

Sie können diese einfach mit Hilfe des Pakets Bioconductor erreichen EBImage, eine Bildverarbeitung und Analyse-Werkzeugset für R. Um das Paket zu installieren Verwendung:

source("http://bioconductor.org/biocLite.R") 
biocLite("EBImage") 

können Sie dann die Funktionalität von EBImage bereitgestellt verwenden zu laden und das Bild zu skalieren, wie im folgenden Beispiel.

library("EBImage") 

x <- readImage(system.file("images", "sample-color.png", package="EBImage")) 

# width and height of the original image 
dim(x)[1:2] 

# scale to a specific width and height 
y <- resize(x, w = 200, h = 100) 

# scale by 50%; the height is determined automatically so that 
# the aspect ratio is preserved 
y <- resize(x, dim(x)[1]/2) 

# show the scaled image 
display(y) 

# extract the pixel array 
z <- imageData(y) 

# or 
z <- as.array(y) 

Weitere Beispiele für die Funktionalität von EBImage bereitgestellt siehe das Paket vignette.

+0

Danke - das ist genau das, was ich gesucht habe –

5

diese Optionen decken Sie, was Sie brauchen:

library(jpeg) 

img <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg")) 

# Set image size in pixels 
for (i in 3:6) { 
    jpeg(paste0("Pixels",i,".jpeg"), width=200*i, height=200*i) 
    plot(as.raster(img)) 
    dev.off() 
} 

# Set image size in inches (also need to set resolution in this case) 
for (i in 3:6) { 
    jpeg(paste0("Inches",i,".jpeg"), width=i, height=i, unit="in", res=600) 
    plot(as.raster(img)) 
    dev.off() 
} 

Sie auch in anderen Formaten speichern können; PNG, BMP, TIFF, pdf. ?jpeg zeigt Hilfe zum Speichern in Bitmap-Formaten an. ?pdf für Hilfe beim Speichern als PDF.

2

Ich verwende den folgenden Code, um Matrizen neu zu berechnen. Wenn Sie ein JPEG-Objekt haben, können Sie dies für jeden einzelnen Farbkanal tun.

Die Strategie ist wie folgt:

eine Matrix m mit den Abmessungen Gegeben a und b und die neuen Dimensionen a.new und b.new

  1. Definieren Sie Ihr neues Netz
x.new <- seq(1,a,length.out=a.new) 
y.new <- seq(1,a,length.out=b.new) 
  1. resample zweimal die ursprüngliche Matrix in x und in y Richtung
V <- apply(V,2,FUN=function(y,x,xout) return(spline(x,y,xout=xout)$y),x,x.new) 
V <- t(apply(V,1,FUN=function(y,x,xout) return(spline(x,y,xout=xout)$y),d,y.new)) 

Hier wähle ich die Spline-Interpolation, aber Sie können auch eine lineare verwenden eins mit apporx(). Mit der Funktion image(x = x.new, y = y.new, z = V) erhalten Sie zusätzlich eine x- und y-Achse für das Plotten.

Am besten.

7

Das Paket imager ist eine schöne Passform und versteckt alle Details über Splines, Einschübe und speichert einfach die Bilder in einem 4-dimensionalen Array (die vierte Dimension im Fall von Videos verwendet wird)

library(imager) 

im <- load.image(my_file) 

thmb <- resize(im,round(width(im)/10),round(height(im)/10)) 

plot(im) 
plot(thmb,main="Thumbnail") 

Mehr Informationen finden Sie hier: on the official introduction.

0

Inspiriert von Seily, um Graustufenbild Größe zu ändern.