2013-06-10 15 views
13

Come posso lisciare questa immagine in R, in modo che rimangano solo due picchi?Levigatura immagine in R

Se si trattasse di dati 1d, eseguirei una media di esecuzione o adattare una funzione di regressione ad esso. Ma non ho trovato informazioni molto specifiche sull'applicazione di questi metodi su una matrice 2d. Ad esempio, ho provato a utilizzare filter() dal pacchetto stats.

Ho pensato anche al kriging, ma questo riguarda più l'interpolazione, vero?

spectrogram

+0

imageJ è buono a quelle cose – baptiste

+0

Si potrebbe dare un'occhiata al pacchetto 'raster'. –

+0

Inoltre, la tua domanda non mostra molti sforzi di ricerca. Ci mostri ciò che hai provato e punti a ciò che non capisci. In questo momento ci stai chiedendo di fare il lavoro per te, almeno così è come ci si sente. –

risposta

17

Il pacchetto spatstat detiene una funzione blur() che applicates una sfocatura gaussiana. In questo modo l'immagine viene attenuata, la maggior parte del rumore scompare e i due picchi principali sono chiaramente distinguibili.

L'effetto può essere visto nella figura seguente ed è piuttosto notevole, specialmente nella trama 3D.

effects of blurring

Il codice per generare l'immagine era:

library(jpeg) 
library(fields) 
library(spatstat) 

picture <- readJPEG("~/Downloads/spectrogram.png.jpeg") 
picture2 <- as.matrix(blur(as.im(picture), sigma=6)) 

layout(matrix(c(1:4), nrow=2)) 
image.plot(picture, col=gray.colors(50), main="original image", asp=1) 
image.plot(picture2, col=gray.colors(50), main="blurred with sigma = 6", asp=1) 
drape.plot(1:nrow(picture), 1:ncol(picture), picture, border=NA, theta=0, phi=45, main="original spectrogram") 
drape.plot(1:nrow(picture), 1:ncol(picture), picture2, border=NA, theta=0, phi=45, main="blurred with sigma = 6") 
+0

Sai perché non funziona qui? 'rawimg = readJPEG (" church.jpg ") rawimg = t (rawimg) # rawimg = t (sfocatura (as.im (rawimg), sigma = 6)) rawimg = rawimg [, ncol (rawimg): 1 ] 'Ho ricevuto questo errore:' Errore in '[.im' (rawimg,, ncol (rawimg): 1): L'operazione sottoinsieme non è definita per questo tipo di indice' –

+0

Se non si dispone di un bianco e nero immagine, la tua immagine sarà una lista di tre matrici, ognuna per un canale di rgb (rosso, verde e blu). Quindi non è possibile utilizzare il comando t(). – nnn

11

penso che si dovrebbe avere uno sguardo alla funzione di focal nel pacchetto raster. Per esempio (copiato dalla documentazione raster):

r <- raster(ncols=36, nrows=18, xmn=0) 
r[] <- runif(ncell(r)) 
# 3x3 mean filter 
r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3)) 

La documentazione comprende ulteriori dettagli.

+0

Ok, anche questo lo farebbe. Questo ha un significato come la mia prima Idea. Ma la sfocatura di Gauss dà risultati migliori. Ma grazie per la risposta comunque. – nnn

+0

funziona perfettamente per me! :) – maycca

7

Si consiglia di dare un'occhiata al pacchetto EBImage. Ci sono più funzioni per lisciare l'immagine.

Ad esempio, un filtro mediano:

# Load EBImage up 
require(EBImage) 
# Read in your image 
im = readImage('/path/to/your/image') 
# Apply a median filter with window size of 7 
im.med = medianFilter(im, size=7) 
# Display image 
display(im.med) 

Median filter applied with 7x7

o si potrebbe provare una sfocatura gaussiana:

# Apply a gaussian blur with sigma=4 
im.gaus = gblur(im, sigma=4) 
# Display image 
display(im.gaus) 

enter image description here

Spero che questo aiuti!

+1

Lo farebbe anche, come la sfocatura di Gauss nel pacchetto 'spatstat' o la media in esecuzione nel pacchetto' raster'. Mi piace lo sfocato di Gauss, perché il filtro mediano crea una sorta di strisce verticali e orizzontali. Grazie per la risposta. Buono a sapersi che ci sono diversi modi per ottenere ciò che ho cercato! – nnn

+0

@ by0 cosa devo fare se ricevo questo errore? '> install.packages (" EBImage ") Avviso nei pacchetti install.: pacchetto 'EBImage' non disponibile (per R versione 3.0.2)' –

+1

Si sta provando a installare 'EBImage' da CRAN? Non installare install.packages ('EBImage'), invece installarlo da Bioconductor come questo 'source (" http://bioconductor.org/biocLite.R "); biocLite ("EBImage") ' – by0