2013-06-10 2 views
13

Comment est-ce que je peux lisser cette image dans R, de sorte qu'il ne reste que deux pics?Lissage d'image dans R

Si ce serait des données 1d, je ferais une moyenne en cours d'exécution ou d'ajuster une fonction de régression. Mais je n'ai pas trouvé d'informations très spécifiques sur l'application de ces méthodes sur une matrice 2D. Par exemple, j'ai essayé d'utiliser filter() à partir du package stats.

J'ai aussi pensé à kriging, mais c'est plutôt une question d'interpolation, n'est-ce pas?

spectrogram

+0

imageJ est bon à ces choses – baptiste

+0

Vous pourriez jeter un coup d'oeil au paquet de 'raster'. –

+0

En outre, votre question ne montre pas beaucoup d'effort de recherche. Vous nous montrez ce que vous avez essayé, et vous montrez ce que vous ne comprenez pas. En ce moment, vous nous demandez de faire le travail pour vous, du moins c'est ce que vous ressentez. –

Répondre

17

Le paquet spatstat détient une fonction blur() que applicates un flou gaussien. Cela étouffe l'image d'une manière, que la plupart du bruit disparaît et que les deux pics principaux sont clairement distincts.

L'effet peut être vu dans l'image suivante et est assez remarquable, en particulier dans le tracé 3D.

effects of blurring

Le code pour générer l'image était:

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

Savez-vous pourquoi cela ne fonctionne pas ici? 'rawimg = readJPEG (" church.jpg ") rawimg = t (rawimg) # rawimg = t (flou (comme.im (rawimg), sigma = 6)) rawimg = rawimg [, ncol (rawimg): 1 ] 'Je reçois cette erreur:' Erreur dans '[.im' (rawimg,, ncol (rawimg): 1): L'opération de sous-ensemble est indéfinie pour ce type d'index' –

+0

Si vous n'avez pas de noir et blanc image, votre image sera une liste de trois matrices, chacune pour un canal de RVB (rouge, vert et bleu). Par conséquent, vous ne pouvez pas utiliser la commande t(). – nnn

11

Je pense que vous devriez jeter un oeil à la fonction focal dans le package de trame. Par exemple (copié à partir de la documentation 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 documentation comprend plus de détails.

+0

Ok, cela aussi le ferait. Cela fonctionne comme ma première idée. Mais le flou de Gauss donne de meilleurs résultats. Mais merci pour la réponse de toute façon. – nnn

+0

cela fonctionne parfaitement pour moi! :) – maycca

7

Vous voulez certainement jeter un coup d'œil au paquet EBImage. Il y a plusieurs fonctions pour lisser votre image.

Par exemple, un filtre médian:

# 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

ou vous pouvez essayer un flou gaussien:

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

enter image description here

Hope this helps!

+1

Cela le ferait aussi, comme le flou de Gauss dans le paquetage 'spatstat' ou le moyen courant dans le paquet' raster'. J'aime mieux le flou de Gauss, car le filtre médian crée des bandes verticales et horizontales. Merci d'avoir répondu. Bon à savoir qu'il y a plusieurs façons de réaliser ce que j'ai cherché! – nnn

+0

@ by0 Que dois-je faire si je reçois cette erreur? '> install.packages (" EBImage ") Avertissement dans le fichier install.packages: Le paquet 'EBImage' n'est pas disponible (pour R version 3.0.2)' –

+1

Etes-vous en train d'essayer d'installer 'EBImage' à partir de CRAN? Ne pas 'install.packages ('EBImage')', mais l'installer à partir de Bioconductor comme ceci 'source (" http://bioconductor.org/biocLite.R "); biocLite ("EBImage") ' – by0