Entfernen Sie Pixelklumpen in R.


8

Ich möchte isolierte Pixel (oder Pixelklumpen <9) aus meinem Rasterbild entfernen .

library(raster)
# create some raster data
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
rc <- clump(r) 

Vor dem Entfernen von Pixelklumpen <9

Geben Sie hier die Bildbeschreibung ein

Nach dem Entfernen von Pixelklumpen <9 :

Geben Sie hier die Bildbeschreibung ein

In Erdas gibt es das Sieb-Werkzeug , um dies zu tun, aber wie kann man es in R ersetzen?


1
Schauen Sie sich "Anwenden eines Rastersiebs durch Verklumpen" in Lektion 7: Erweiterte Rasteranalyse
Gen

Großartig, vielen Dank, ich kenne diese Seite nicht! :)
Maycca

Antworten:


4
#reproducible example
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
rc <- clump(r) 

#extract IDs of clumps according to some criteria
clump9 = data.frame(freq(rc))
clump9 = clump9[ ! clump9$count < 9, ] #remove clump observations with frequency smaller than 9
clump9 = as.vector(clump9$value) # record IDs from clumps which met the criteria in previous step

rc[rc != clump9[1] & rc != clump9[2]] = NA #replace cells with IDs which do not belong to the group of interest 

plot(rc,col="black",legend=FALSE)

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass clumpdie Klumpen-ID "4" von der Funktion 2 Zellen auf der rechten Seite hatte, die mit Zellen auf der linken Seite verbunden waren.

head(rc)
    1  2  3  4  5  6  7  8  9 10 11 12
1  NA NA NA NA  2 NA  2  2 NA NA NA NA
2  NA NA NA  2 NA  2  2 NA  2  2 NA NA
3  NA NA NA NA NA  2 NA NA NA NA NA NA
4  NA  4 NA  2 NA  2 NA NA NA NA NA NA
5  NA  4 NA NA  2 NA NA NA NA NA NA NA
6  NA  4 NA NA NA NA NA NA NA NA NA NA
7   4 NA NA NA NA NA NA NA NA NA NA NA
8  NA  4 NA NA NA NA NA NA NA NA  4  4
9   4 NA NA NA NA NA NA NA NA NA NA NA
10 NA  4 NA NA NA NA NA NA NA NA NA NA

1
Danke Andre, ich habe es bereits erkannt und ich habe das Erweiterungswerkzeug r2 <-extend (r, c (1,1)) verwendet
Maycca

6

Dank @gene und https://geoscripting-wur.github.io/AdvancedRasterAnalysis/ kann ich jetzt meine Frage beantworten (kopiert und geändert):

Bibliothek (Raster)

# create some raster data
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
r[r==0]<-NA

# extend r with a number of rows and culomns (at each side)
# to isolate clumps adjacents to plot axes 
r2<-extend(r, c(1,1))
rc <- clump(r2, directions = 8) 

# get frequency table    
f<-freq(rc)
# save frequency table as data frame
f<-as.data.frame(f)

# which rows of the data.frame are only represented by clumps under 9pixels?
str(which(f$count <= 9))
# which values do these correspond to?
str(f$value[which(f$count <= 9)])
# put these into a vector of clump ID's to be removed
excludeID <- f$value[which(f$count <= 9)]

# make a new raster to be sieved
formaskSieve <- rc
# assign NA to all clumps whose IDs are found in excludeID
formaskSieve[rc %in% excludeID] <- NA

plot(formaskSieve)

und gewünschtes Ergebnis (mit einer Zeile und einer Spalte NA auf jeder Seite des Rasters).

Geben Sie hier die Bildbeschreibung ein


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.