Supprimer les blocs de pixels dans R


8

Je souhaite supprimer des pixels isolés (ou des blocs de pixels <9) de mon image raster.

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) 

Avant de supprimer des blocs de pixels <9

entrez la description de l'image ici

Après avoir supprimé des blocs de pixels <9 :

entrez la description de l'image ici

Dans Erdas, il existe l' outil Sieve pour le faire, mais comment le remplacer dans R?


1
Regardez "Appliquer un tamis raster en agglomérant" dans la leçon 7: Analyse raster avancée
gène

Génial, merci beaucoup, je ne connais pas ce site! :)
maycca

Réponses:


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)

entrez la description de l'image ici

Notez que d'après la clumpfonction, l'ID de bloc "4" avait 2 cellules sur le côté droit se connectant avec des cellules sur la gauche.

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
Merci Andre, je l'ai déjà réalisé et j'ai utilisé l'outil d'extension r2 <-extend (r, c (1,1))
maycca

6

Grâce à @gene et https://geoscripting-wur.github.io/AdvancedRasterAnalysis/ je peux maintenant répondre à ma question (copiée et modifiée):

bibliothèque (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)

et résultat souhaité (avec une ligne et une colonne de NA ajoutées de chaque côté du raster).

entrez la description de l'image ici


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.