调整R中的图像大小

时间:2016-03-04 02:07:44

标签: r image jpeg

我正在尝试使用R中的一些图像数据,并且无法弄清楚如何调整图像大小以确保它们的大小相同。

在Python中,我解决了这个问题如下:

from PIL import Image
import numpy as np

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

在R中,我一直无法找到能够完成同样事情的库。 我能得到的最远的是:

library(jpeg)

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

最简单的方法是像Pillow这样的库我可以打电话,但正如我所说,我似乎无法找到任何东西。

谢谢,

5 个答案:

答案 0 :(得分:19)

You can easily accomplish this with the help of the Bioconductor package EBImage, an image processing and analysis toolbox for R. To install the package use:

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

You can then use the functionality provided by EBImage to load and scale the image, as in the following example.

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)

For more examples on the functionality provided by EBImage see the the package vignette .

答案 1 :(得分:9)

imager非常合适,隐藏了关于样条,插值的所有细节,只是将图像存储在一个4维数组中(第四维用于视频)

library(imager)

im <- load.image(my_file)

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

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

可以在此处找到更多信息:on the official introduction.

答案 2 :(得分:7)

这些选项是否满足您的需求:

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

您还可以保存为其他格式; png,bmp,tiff,pdf。 ?jpeg将显示保存位图格式的帮助。 ?pdf有关以pdf格式保存的帮助。

答案 3 :(得分:3)

我使用以下代码重新采样矩阵。如果您有一个jpeg对象,则可以为每个颜色通道个体执行此操作。

策略如下:

给定尺寸为ma的矩阵b以及新尺寸a.newb.new

  1. 定义新网格
  2. x.new <- seq(1,a,length.out=a.new)
    y.new <- seq(1,a,length.out=b.new)
    
    1. xy方向
    2. 中重复采样原始矩阵两次
      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))
      

      在这里,我选择样条插值,但您也可以使用apporx()的线性插值。您将获得额外的x轴和y轴,以便使用image(x = x.new, y = y.new, z = V)函数进行绘图。

      最佳。

答案 4 :(得分:1)

受Seily的启发,调整灰度图像的大小。

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