web-dev-qa-db-fra.com

Redimensionnement de l'image en R

J'essaie de travailler avec certaines données d'image dans R et je ne sais pas comment redimensionner les images dont je dispose pour m'assurer qu'elles sont toutes de la même taille.

En Python, j'ai abordé ce problème comme suit:

from PIL import Image
import numpy as np

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

En R, j’ai été incapable de localiser une bibliothèque capable de faire la même chose ... Le plus éloigné que j’ai pu obtenir est:

library(jpeg)

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

La solution la plus simple serait une bibliothèque comme Pillow à laquelle je pourrais faire appel, mais comme je l’ai dit, je ne trouve rien.

Merci,

13

Vous pouvez facilement accomplir cela à l'aide du paquet Bioconductor package EBImage, une boîte à outils de traitement et d'analyse d'images pour R. Pour installer le package, utilisez:

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

Vous pouvez ensuite utiliser les fonctionnalités fournies par EBImage pour charger et redimensionner l'image, comme dans l'exemple suivant.

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)

Pour plus d'exemples sur les fonctionnalités fournies par EBImage, voir le package vignette .

17
aoles

Le paquetage imager convient parfaitement et cache tous les détails sur les splines, les interpolations et stocke simplement les images dans un tableau à 4 dimensions (la quatrième dimension étant utilisée dans le cas de vidéos)

library(imager)

im <- load.image(my_file)

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

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

Plus d'informations peuvent être trouvées ici: sur l'introduction officielle.

9
RUser4512

Est-ce que ces options couvrent ce dont vous avez besoin:

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

Vous pouvez également enregistrer dans d'autres formats. png, bmp, tiff, pdf. ?jpeg affichera une aide pour la sauvegarde en format bitmap. ?pdf pour obtenir de l'aide sur l'enregistrement au format PDF.

7
eipi10

J'utilise le code suivant pour rééchantillonner les matrices. Si vous avez un objet jpeg, vous pouvez le faire pour chaque canal de couleur.

La stratégie est la suivante:

Étant donné une matrice m avec les dimensions a et b et les nouvelles dimensions a.new et b.new

  1. Définissez votre nouvelle grille
x.new <- seq(1,a,length.out=a.new)
y.new <- seq(1,a,length.out=b.new)
  1. rééchantillonner la matrice d'origine deux fois dans x et dans y direction
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))

Ici, je choisis l’interpolation de spline mais vous pouvez aussi utiliser un linéaire avec apporx(). Vous obtiendrez en outre un axe x et un axe pour le traçage avec la fonction image(x = x.new, y = y.new, z = V).

Meilleur.

3
Seily

Inspiré par Seily, redimensionner une image en niveaux de gris.

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)
}
1
Simon Ji