2013-06-10 4 views
13

Wie kann ich dieses Bild in R glätten, so dass nur zwei Spitzen übrig bleiben?Bildglättung in R

Wenn dies 1d Daten wären, würde ich einen laufenden Mittelwert oder passen Sie eine Regressionsfunktion dazu. Aber ich habe keine sehr spezifischen Informationen über die Anwendung dieser Methoden auf eine 2D-Matrix gefunden. Zum Beispiel habe ich versucht, filter() aus dem stats Paket zu verwenden.

Ich dachte auch über Kriging nach, aber das ist mehr über Interpolation, oder?

spectrogram

+0

imageJ ist gut bei diesen Dingen – baptiste

+0

Sie könnten sich das 'raster' Paket anschauen. –

+0

Darüber hinaus zeigt Ihre Frage nicht viel Forschungsaufwand. Du zeigst uns, was du versucht hast, und du zeigst auf das, was du nicht verstehst. Im Moment bitten Sie uns, die Arbeit für Sie zu tun, so fühlt es sich zumindest an. –

Antwort

17

Das Paket spatstat besitzt eine Funktion, die eine blur() Gaußschen Unschärfe applicates. Dadurch wird das Bild so gemixt, dass der größte Teil des Rauschens verschwindet und die beiden Hauptspitzen klar erkennbar sind.

Der Effekt ist im folgenden Bild zu sehen und besonders im 3D-Plot bemerkenswert.

effects of blurring

Der Code, um das Bild zu erzeugen, war:

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

Wissen Sie, warum es hier nicht funktioniert? 'rawimg = readJPEG (" church.jpg ") rawimg = t (rawimg) # rawimg = t (Unschärfe (as.im (rawimg), Sigma = 6)) rawimg = rawimg [, ncol (rawimg): 1 ] 'Ich erhalte diesen Fehler:' Fehler in '[.im' (rawimg,, ncol (rawimg): 1): Die Teilmengenoperation ist für diesen Typ von Index ' –

+0

nicht definiert. Wenn Sie kein Schwarz-Weiß haben Bild, Ihr Bild wird eine Liste von drei Matrizen sein, jeweils für einen Kanal von RGB (rot, grün und blau). Daher können Sie den Befehl t() nicht verwenden. – nnn

11

Ich glaube, Sie einen Blick auf die focal Funktion im Raster Paket haben sollten. Zum Beispiel (aus der raster Dokumentation kopiert):

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

Die Dokumentation enthalten weitere Details.

+0

Ok, das würde es auch tun. Das ist ein laufendes Mittel wie meine erste Idee. Aber die Gauss-Unschärfe liefert bessere Ergebnisse. Aber danke für die Antwort trotzdem. – nnn

+0

das funktioniert perfekt für mich! :) – maycca

7

Sie wollen auf jeden Fall einen Blick auf das EBImage Paket werfen. Es gibt mehrere Funktionen zum Glätten Ihres Bildes.

Zum Beispiel kann ein Medianfilter:

# 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

oder Sie können eine Gaußsche Unschärfe versuchen:

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

enter image description here

hoffe, das hilft!

+1

Dies würde es auch tun, wie die Gauss-Unschärfe im Paket "spatstat" oder das laufende Mittel im "raster" -Paket. Ich mag die Gauss-Unschärfe besser, weil der Median-Filter Art von vertikalen und horizontalen Streifen erzeugt. Danke für die Antwort. Gut zu wissen, dass es mehrere Möglichkeiten gibt, um das zu erreichen, wonach ich gesucht habe! – nnn

+0

@ by0 was soll ich tun, wenn ich diesen Fehler erhalte? '> install.packages (" EBImage ") Warnung in den Installationspaketen: Paket 'EBImage' ist nicht verfügbar (für R Version 3.0.2) ' –

+1

Möchten Sie' EBImage' von CRAN installieren? Installieren Sie nicht "install.packages ('EBImage')", sondern installieren Sie es von Bioconductor wie diese Quelle ("http://bioconductor.org/bioclite.R"); bioClite ("EBImage") ' – by0