2016-03-04 31 views
10

Próbuję pracować z niektórymi danymi obrazu w R i nie mogę wymyślić, jak zmienić rozmiar obrazów, aby upewnić się, że są one tego samego rozmiaru.Zmiana rozmiaru obrazu w R

W Pythonie podszedłem ten problem następująco:

from PIL import Image 
import numpy as np 

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

W R, byłem w stanie zlokalizować biblioteki, które osiągnąć to samo. Najdalej udało mi się dostać to:

library(jpeg) 

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

Najprostszym rozwiązaniem byłoby biblioteka jak Pillow które mogłyby wzywam, ale jak już mówiłem, nie wydaje się znaleźć cokolwiek.

Dzięki

Odpowiedz

14

Można łatwo to osiągnąć za pomocą pakietu BioConductor EBImage, z przetwarzania i analizy obrazów Toolbox dla R. Aby zainstalować wykorzystania pakiet:

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

Można wtedy korzystać z funkcjonalności dostarczanej przez EBImage załadować i skalowanie obrazu, jak w poniższym przykładzie.

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) 

Więcej przykładów na funkcjonalność dostarczonych przez EBImage zobaczyć pakiet vignette.

+0

Dzięki - właśnie tego szukałem –

5

Czy te opcje obejmują co trzeba:

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

Można również zapisać w innych formatach; png, bmp, tiff, pdf. ?jpeg wyświetli pomoc dotyczącą zapisywania w formatach bitmapowych. ?pdf, aby uzyskać pomoc dotyczącą zapisywania w formacie pdf.

2

Poniższy kod służy do ponownego próbkowania macierzy. Jeśli masz obiekt jpeg, możesz to zrobić dla każdego kanału koloru indywidualnego.

Strategia jest następująca:

Biorąc pod uwagę macierz m o wymiarach a i b i nowych wymiarów a.new i b.new

  1. definiować nowe siatki
x.new <- seq(1,a,length.out=a.new) 
y.new <- seq(1,a,length.out=b.new) 
  1. resample oryginalną matrycę dwa razy w x i y kierunku
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)) 

Tu wybrać spline-interpolacji, ale można też użyć liniowy jeden z apporx(). Otrzymasz dodatkowo oś X i Y dla wykreślania z funkcją image(x = x.new, y = y.new, z = V).

Najlepsza.

7

Pakiet imager jest ładne dopasowanie i ukrywa wszystkie szczegóły o rowkowane, interpolacji i po prostu zapisuje obrazy w 4-wymiarowej tablicy (czwarty wymiar wykorzystywane w przypadku filmów)

library(imager) 

im <- load.image(my_file) 

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

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

Więcej informacje można znaleźć tutaj: on the official introduction.

0

Zainspirowany przez Seily, aby zmienić szary obraz.

resize = function(img, new_width, new_height) { 
    new_img = apply(img, 2, function(y){return (spline(y, n = new_height)$y)}) 
    new_img = t(apply(new_img, 1, function(y){return (spline(y, n = new_width)$y)})) 

    new_img[new_img < 0] = 0 
    new_img = round(new_img) 

    return (new_img) 
}