Подтвердить что ты не робот

Изменение размера изображения в 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, на которую я мог бы позвонить, но, как я уже сказал, я ничего не могу найти.

Спасибо,

4b9b3361

Ответ 1

Вы можете легко выполнить это с помощью пакета Bioconductor EBImage, инструментария для обработки и анализа изображений для R. To установите использование пакета:

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.

Ответ 2

Пакет 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")

Более подробную информацию можно найти здесь: в официальном вступлении.

Ответ 3

Включите ли эти опции то, что вам нужно:

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.

Ответ 4

Я использую следующий код для повторной выборки матриц. Если у вас есть объект 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)
  1. повторите выборку исходной матрицы дважды в 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).

Бест.

Ответ 5

Вдохновленный Сейли, чтобы изменить размер изображения уровня серого.

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