как удалить скопление пикселей с помощью функции clump в R

#r #image #image-processing #pixel

#r #изображение #обработка изображений #пиксель

Вопрос:

Я хотел бы удалить пиксели, которые образуют большой кластер, и оставить для анализа только небольшой кластер (означает получение количества пикселей и местоположений). Сначала я применяю фильтр для окрашивания в белый цвет всех пикселей, значение которых ниже 0,66. Затем я использую функцию clump() в R. Модель работает, но я не могу удалить только большой кластер. Я не понимаю, как работает функция clump.

Исходное изображение:

введите описание изображения здесь

Изображение результатов: plot_r — это изображение, на котором пиксели со значением < 0.66 изменены на 0. plot_rc — это результаты после функции clump(). Как уже отмечалось, я не могу удалить только большое скопление пикселей (поверх изображения plot_r). Я изменил значение (700 в коде), но не лучше, как это сделать?

введите описание изображения здесь

Вот код:

 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] amp; rc != clump9[2]] = NA 

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

Ответ №1:

Возможно, что-то вроде этого

 library(raster)
library(igraph)
  

Немного сокращает ваш подход

 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")
  

Замените скопления количеством ячеек, из которых они состоят, а затем установите для большего (здесь более 100 ячеек) значение NA и используйте результат для маскировки исходного растра

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