how to remove cluster of pixels using clump function in R

非 Y 不嫁゛ 提交于 2021-01-29 19:30:34

问题


I would like to remove the pixels that form a large cluster and keep only the small cluster to analyse (means get pixels number and locations). First I apply a filter to color in white all pixels that has a value lower to 0.66. Then I use the function clump() in R. The model works but I cannot remove only the large cluster. I do not understand how clump function works.

Initial image:

Results image: plot_r is the image where the pixels with value < 0.66 are changed to 0. plot_rc is the results after clump() function. As observed I cannot remove only the large cluster of pixels (on top of the image plot_r). I changed the value (700 in the code) but not better, how to do?

Here the code:

library(magick)
library(pixmap)
library(raster)
library(igraph)

f <- "https://i.stack.imgur.com/2CjCh.jpg"
x <- image_read(f)
x <- image_convert(x, format = "pgm", depth = 8)

# Save the PGM file
f <- tempfile(fileext = ".pgm")
image_write(x, path = f, format = "pgm")

# Read in the PGM file
picture <- read.pnm(file = f, cellres = 1)
str(picture)
picture@size
mat <- picture@grey
mat[mat<0.66] <- 0; x

##############################################################
##Remove clumps of pixels in R using package Raster and igraph
#Detect clumps (patches) of connected cells
r <-raster(mat)
rc <- clump(r) 

#extract IDs of clumps according to some criteria
clump9 = data.frame(freq(rc))
#remove clump observations with frequency smaller/larger than N
clump9 = clump9[ ! clump9$count > 700, ]
# record IDs from clumps which met the criteria in previous step
clump9 = as.vector(clump9$value) 
#replace cells with IDs which do not belong to the group of interest 
rc[rc != clump9[1] & rc != clump9[2]] = NA 

# converting rasterlayer to matrix
n <- as.matrix(r)
m <- as.matrix(rc)

回答1:


Perhaps something like this

library(raster)
library(igraph)

Short-cutting your approach a bit

f <- "https://i.stack.imgur.com/2CjCh.jpg"
b <- brick(f)
x <- sum(b)
r <- x > 450    
rc <- clump(r) 
f <- freq(rc, useNA="no")

Replace the clumps with the number of cells they consist of and then set the larger one (here more than 100 cells) to NA, and use the result to mask the original raster

rs <- subs(rc, data.frame(f))
rsc <- reclassify(rs, cbind(100,Inf,NA))    
m <- mask(b, rsc)
plotRGB(m)


来源:https://stackoverflow.com/questions/63878069/how-to-remove-cluster-of-pixels-using-clump-function-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!