在 R 中调整图像大小
Resizing image in R
我正在尝试使用 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 这样我可以调用的库,但正如我所说,我似乎找不到任何东西。
谢谢,
这些选项是否满足您的需求:
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 的帮助。
我使用以下代码对矩阵进行重采样。如果您有一个 jpeg 对象,您可以为每个颜色通道单独执行此操作。
攻略如下:
给定矩阵 m
,维度 a
和 b
以及新维度 a.new
和 b.new
- 定义新网格
x.new <- seq(1,a,length.out=a.new)
y.new <- seq(1,a,length.out=b.new)
- 在
x
和y
方向对原始矩阵重新采样两次
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)
函数进行绘图。
最佳。
您可以借助 Bioconductor 包 EBImage 轻松完成此任务,这是一个用于 R[=25= 的图像处理和分析工具箱].要安装软件包,请使用:
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
然后您可以使用 EBImage 提供的功能来加载和缩放图像,如下例所示。
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)
有关 EBImage 提供的功能的更多示例,请参阅包 vignette。
包 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.
受 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)
}
我正在尝试使用 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 这样我可以调用的库,但正如我所说,我似乎找不到任何东西。
谢谢,
这些选项是否满足您的需求:
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 的帮助。
我使用以下代码对矩阵进行重采样。如果您有一个 jpeg 对象,您可以为每个颜色通道单独执行此操作。
攻略如下:
给定矩阵 m
,维度 a
和 b
以及新维度 a.new
和 b.new
- 定义新网格
x.new <- seq(1,a,length.out=a.new) y.new <- seq(1,a,length.out=b.new)
- 在
x
和y
方向对原始矩阵重新采样两次
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)
函数进行绘图。
最佳。
您可以借助 Bioconductor 包 EBImage 轻松完成此任务,这是一个用于 R[=25= 的图像处理和分析工具箱].要安装软件包,请使用:
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")
然后您可以使用 EBImage 提供的功能来加载和缩放图像,如下例所示。
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)
有关 EBImage 提供的功能的更多示例,请参阅包 vignette。
包 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.
受 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)
}