2013-06-10 14 views
13

Jak mogę wygładzić to zdjęcie w R, aby pozostały tylko dwa piki?Wygładzanie obrazu w R

Gdyby to były dane 1d, zrobiłbym średnią średnią lub dopasowałem do niej funkcję regresji. Ale nie znalazłem bardzo konkretnych informacji na temat stosowania tych metod na matrycy 2d. Na przykład próbowałem użyć filter() z pakietu stats.

Też myślałem o kriging, ale to jest bardziej o interpolacji, prawda?

spectrogram

+0

imageJ jest dobry w tych rzeczach – baptiste

+0

Możesz rzucić okiem na pakiet 'raster'. –

+0

Ponadto twoje pytanie nie wykazuje dużego nakładu pracy badawczej. Pokazujesz nam, co próbujesz, i wskazujesz na to, czego nie rozumiesz. W tej chwili prosisz nas o wykonanie pracy za ciebie, przynajmniej tak to się czuje. –

Odpowiedz

17

Pakiet spatstat posiada funkcję blur() że applicates rozmycie Gaussa. To sprawia, że ​​obraz w pewnym sensie znika, a dwa główne szczyty są wyraźnie widoczne.

Efekt można zobaczyć na poniższym obrazku i jest dość niezwykły, zwłaszcza w działce 3d.

effects of blurring

Kod do generowania obrazu było:

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

Czy wiesz, dlaczego to nie działa tutaj? 'Rawimg = readJPEG ("church.jpg") rawimg = T (rawimg) # rawimg = T (plama (as.im (rawimg), Sigma = 6)) rawimg = rawimg [, Ncol (rawimg): 1 ] 'Otrzymuję ten błąd:' Błąd w '[.im' (rawimg,, ncol (rawimg): 1): Operacja podzestawu jest niezdefiniowana dla tego typu indeksu' –

+0

Jeśli nie masz czarno-białego image, twój obraz będzie listą trzech macierzy, każda dla jednego kanału rgb (czerwony, zielony i niebieski). Dlatego nie można użyć polecenia t(). – nnn

11

myślę, że należy przyjrzeć się funkcji w pakiecie rastrowej focal. Na przykład (skopiowany z dokumentacją 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)) 

Dokumentacja zawierać więcej szczegółów.

+0

OK, to też by to zrobiło. To działa tak, jak mój pierwszy pomysł. Ale rozmycie Gaussa daje lepsze efekty. Ale dzięki za odpowiedź. – nnn

+0

to działa idealnie dla mnie! :) – maycca

7

Na pewno chcesz rzucić okiem na pakiet EBImage. Istnieje wiele funkcji do wygładzania obrazu.

Przykładowo, mediana filtr:

# 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

lub można spróbować rozmycie Gaussa:

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

enter image description here

nadzieję, że to pomaga!

+1

Zrobiłoby to również, tak jak rozmycie Gaussa w pakiecie 'spatstat' lub średnia działająca w pakiecie' raster'. Lubię rozmycie Gaussa lepiej, ponieważ filtr medianowy tworzy rodzaj pionowych i poziomych pasków. Dziękuję za odpowiedź. Dobrze wiedzieć, że istnieje wiele sposobów na osiągnięcie tego, czego szukałem! – nnn

+0

@ by0 co powinienem zrobić, jeśli otrzymam ten błąd? '> install.packages (" EBImage ") Ostrzeżenie w pakiecie install.packages: pakiet" EBImage "nie jest dostępny (dla wersji R 3.0.2)' –

+1

Czy próbujesz zainstalować 'EBImage' z CRAN? Nie "install.packages (" EBImage ")', zamiast tego zainstaluj go z Bioconductor jak ten 'source (" http://bioconductor.org/biocLite.R "); biocLite ("EBImage") " – by0

Powiązane problemy