Как бы я получить число (количество или сумму) черных пикселей, соединенных более чем 1 другим черным пикселем в матрице? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь получить число 1с (черные пиксели), соединенных более чем одним другим черным пикселем в двоичной матрице. У меня есть матрица ...

set.seed(1234)
mat <- matrix(rbinom(30, 1, 0.5), nrow = 5)

, которая выводит матрицу ...

      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    1    0    0    0
[2,]    1    1    1    1    0    0
[3,]    1    0    1    0    0    0
[4,]    1    0    1    1    0    0

Я сейчас пытаюсь выяснить, как использовать эту матрицу, чтобы получить количество (сумма) всех черных пикселей, к которым подключено более 1 другого черного пикселя, например ...

[1,2] [1,3] [2,1] [2,2] [2,3] [3,1] [3,3] [4,3] = 8 

Где 8, я думаю, будет ожидаемым результатом. Есть ли способ сделать это?

1 Ответ

2 голосов
/ 14 октября 2019

Вы можете использовать diff в сочетании с apply, чтобы получить число соседних пикселей, имеющих 1.

f  <- function(x) {
  tt  <- diff(x)==0  #See it there is no difference between Neighbors - Length is 1 less then x
  (c(0, tt) + c(tt, 0)) * x #Add a Zero at the begin and end and multiply it with x to get the number of Neighbors in 1 direction
}

n  <- t(apply(mat, 1, f)) + apply(mat, 2, f) #Use function f over rows and cols to get the number of Neighbors is two directions

sum(n>1)
#[1] 8

which(n>1, arr.ind = T)
     row col
#[1,]   3   1
#[2,]   4   1
#[3,]   5   1
#[4,]   4   2
#[5,]   5   2
#[6,]   1   3
#[7,]   2   6
#[8,]   3   6

n
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    1    3    1    0    1
#[2,]    1    0    1    0    0    2
#[3,]    2    0    0    0    0    2
#[4,]    3    3    1    0    0    1
#[5,]    2    2    0    0    0    0

Данные:

set.seed(1234)
mat <- matrix(rbinom(30, 1, 0.5), nrow = 5)
mat
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    0    1    1    1    0    1
#[2,]    1    0    1    0    0    1
#[3,]    1    0    0    0    0    1
#[4,]    1    1    1    0    0    1
#[5,]    1    1    0    0    0    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...