2012-03-03 8 views
16

Estoy buscando una manera simple para trazar una imagen JPEG fotográfica en un dispositivo de gráficos en R.Terreno una imagen JPG utilizando gráficos de base en I

Por ejemplo la siguiente utilizando el paquete raster parece ignorar los atributos de color en la imagen. Quiero reproducir la fotografía en sus colores originales:

library(raster) 
library(rgdal) 

myJPG <- raster("colourfulPic.jpg") 
plot(myJPG) ## Recolours JPEG; 

he descubierto que el paquete rimage recientemente se ha archivado y parece ser recomendada ya no para su uso (ver here), si, de hecho, nunca lo hizo lo que necesito.

De manera similar, el EBImage para BioConductor, que posiblemente también funcione, no está diseñado para Windows de 64 bits y, lamentablemente, necesito esta arquitectura.

Por favor, dime, ¿me falta algo muy obvio en los gráficos base?


Respuesta

4

En lugar de rimage, tal vez usar el paquete ReadImages:

library('ReadImages') 
myjpg <- read.jpeg('E:/bigfoot.jpg') 
plot(myjpg) 
+0

sabía que iba a ser simple! A veces, encontrar el paquete correcto es todo lo que se necesita. Gracias. – digitalmaps

+7

FWIW Si te preocupa el rendimiento o el uso de la memoria, usar 'readJPEG (..., native = TRUE)' from 'jpeg' para leer y luego' rasterImage' from 'graphics' para trazar es mucho más eficiente para imágenes grandes, ya que evita todas las conversiones innecesarias en matrices que hace 'ReadImages'. –

+3

Desafortunadamente, el paquete 'ReadImages' está huérfano y ya no está disponible en CRAN.No se ha actualizado para funcionar con las versiones R 2.14.0 y posteriores. – Stibu

-1

Tenga en cuenta que ReadImages ahora es obsoleto. En su lugar, puede instalar biOps package, que también contiene un amplio conjunto de métodos de manipulación de imágenes. Utilice la siguiente manera:

library(jpeg) 
library(biOps) 

image <- readJPEG("test.jpg") 

# image is of type imagedata (the red,green,blue channel images concatenated) 

plot(image) 

Editar: un objeto del tipo que se accede a imagedata como image[Y,X,Channel], por cierto

+5

NOTA: BiOps ahora también está en desuso. ¿Hay alguna manera fácil de trazar una imagen JPEG? Parece que hay una gran cantidad de datos con el paquete 'jpeg' y toma mucho uso de la CPU para trazar. – logicForPresident

+0

@ratioVenandi: Tengo el mismo problema hoy, y acabo de proponer otra solución que no se basa en 'biOps' o' ReadImages' – Jealie

21

Aquí va una solución actualizada, que se basa sólo en el paquete jpeg y se ocupa de imágenes en color y en escala de grises (paquetes utilizados en otras soluciones, están desactualizados y no se instalarán con una versión R reciente).

La solución consiste en esta función parcela:

plot_jpeg = function(path, add=FALSE) 
{ 
    require('jpeg') 
    jpg = readJPEG(path, native=T) # read the file 
    res = dim(jpg)[2:1] # get the resolution, [x, y] 
    if (!add) # initialize an empty plot area if add==FALSE 
    plot(1,1,xlim=c(1,res[1]),ylim=c(1,res[2]),asp=1,type='n',xaxs='i',yaxs='i',xaxt='n',yaxt='n',xlab='',ylab='',bty='n') 
    rasterImage(jpg,1,1,res[1],res[2]) 
} 

Esta función puede entonces ser llamada con el camino de la imagen como argumento, por ejemplo:

plot_jpeg('~/nyancat.jpg') 

Para añadir la imagen a una trazado existente, utilice el interruptor add=TRUE - ¡y tenga cuidado con los límites de los ejes!

+4

Tuve que invertir la resolución para obtener una trama correcta. Cambie res = dim (jpg) [1: 2] a res = dim (jpg) [2: 1] O reemplace todas res [1] con res [2] y viceversa para corregir el error – Samuel

+1

Esto ahora está arreglado en el código editado – gregmacfarlane

1

Si está creando un documento de referencia, knitr::include_graphics() es directo y simple.

2

Usando el paquete imager:

library(imager) 

image <- load.image(image_filename) 
plot(image) 

Esto funciona para un número de formatos de imagen incluyendo jpeg, gif, etc ...