Я занимаюсь оптическим распознаванием символов и сталкиваюсь со следующей проблемой. Я храню глифы в списке двоичных матриц, и они могут быть разного размера, но их максимально возможная ширина равна wid = 3
столбцам (может быть любая константа, а не только 3). В некоторых случаях после первой стадии обработки получить данные, которые выглядят следующим образом:элементы списка расщепления, расширяющие список
myll <- list(matrix(c(0, 0, 0, 1, 1, 0), ncol = 2),
matrix(c(0), ncol = 1),
matrix(c(1, 1, 0), ncol = 3),
matrix(c(1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1), ncol = 7),
matrix(c(1, 1, 1, 1), ncol = 2))
# [[1]]
# [,1] [,2]
# [1,] 0 1
# [2,] 0 1
# [3,] 0 0
#
# [[2]]
# [,1]
# [1,] 0
#
# [[3]]
# [,1] [,2] [,3]
# [1,] 1 1 0
#
# [[4]]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] 1 1 1 0 0 0 1
# [2,] 0 1 0 1 0 0 1
# [3,] 1 1 1 1 0 0 1
#
# [[5]]
# [,1] [,2]
# [1,] 1 1
# [2,] 1 1
Так, некоторые глифы могут быть не разделены по каким-либо причинам. Это происходит только с глифами максимальной возможной ширины. Более того, может быть некоторый барахло в конце матрицы. Я должен разбить их на матрицы шириной ncol = wid
, оставляя последний кусок (мусор) как есть. Тогда я храню эти матрицы в отдельных элементов списка, чтобы получить следующий вывод:
# [[1]]
# [,1] [,2]
# [1,] 0 1
# [2,] 0 1
# [3,] 0 0
#
# [[2]]
# [,1]
# [1,] 0
#
# [[3]]
# [,1] [,2] [,3]
# [1,] 1 1 0
#
# [[4]]
# [,1] [,2] [,3]
# [1,] 1 1 1
# [2,] 0 1 0
# [3,] 1 1 1
#
# [[5]]
# [,1] [,2] [,3]
# [1,] 0 0 0
# [2,] 1 0 0
# [3,] 1 0 0
#
# [[6]]
# [,1]
# [1,] 1
# [2,] 1
# [3,] 1
#
# [[7]]
# [,1] [,2]
# [1,] 1 1
# [2,] 1 1
На данный момент я могу сделать это с помощью этого функции
checkGlyphs <- function(gl_m, wid = 3) {
if (ncol(gl_m) > wid)
return(list(gl_m[,1:wid], matrix(gl_m[,-(1:wid)], nrow = nrow(gl_m)))) else
return(gl_m)
}
separateGlyphs <- function(myll, wid = 3) {
require("magrittr")
presplit <- lapply(myll, checkGlyphs, wid)
total_new_length <-
presplit[unlist(lapply(presplit, is.list))] %>% lapply(length) %>% unlist() %>% sum() +
as.integer(!unlist(lapply(presplit, is.list))) %>% sum()
splitted <- vector("list", length = total_new_length)
spl_index <- 1
for (i in 1:length(presplit))
{
if (!is.list(presplit[[i]]))
{
splitted[[spl_index]] <- presplit[[i]]
spl_index <- spl_index + 1
} else
{
for (j in 1:length(presplit[[i]]))
{
splitted[[spl_index]] <- presplit[[i]][[j]]
spl_index <- spl_index + 1
}
}
}
if (any(lapply(splitted, ncol) > wid)) return(separateGlyphs(splitted, wid)) else
return(splitted)
}
Но я верю, что есть более быстрый и удобный способ добиться того же результата (без использования циклов for
и этого ограниченного переназначения элементов, а затем, при необходимости, рекурсии O_o).
Я буду благодарен за любые предложения по точке или, в качестве альтернативы, для рекомендации некоторых OCR-пакетов для R.
Да, но ... он объединяет все матрицы в один, а затем повторно разделяет их по фиксированной ширине, но действительно в моем списке у меня могут быть матрицы с различным количеством столбцов ... Я написал, что они все то же, но это неправильно, я просто хотел упростить ситуацию. Проблема в том, что мне не нужно касаться хороших матриц (копировать их) и работать только с слишком широкими. Я сделаю выпуски на свой вопрос. – inscaven
Просьба указать критерии, используемые для определения, является ли «слишком широкая» матрица (моя презумпция была> 2) и подтвердить, что обработка «разделена на фиксированную ширину», как вы упомянули в своем сообщении. – Ricky