2015-05-29 5 views
0

Я занимаюсь оптическим распознаванием символов и сталкиваюсь со следующей проблемой. Я храню глифы в списке двоичных матриц, и они могут быть разного размера, но их максимально возможная ширина равна 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.

ответ

0

Это должно сделать трюк, со значениями в final того, что вы после этого.

combined <- do.call(cbind, lapply(myll, unlist)) 
idx <- seq(1, ncol(combined), 2) 
final <- do.call(list, lapply(idx, function(x) combined[, x:(x+1)])) 
+0

Да, но ... он объединяет все матрицы в один, а затем повторно разделяет их по фиксированной ширине, но действительно в моем списке у меня могут быть матрицы с различным количеством столбцов ... Я написал, что они все то же, но это неправильно, я просто хотел упростить ситуацию. Проблема в том, что мне не нужно касаться хороших матриц (копировать их) и работать только с слишком широкими. Я сделаю выпуски на свой вопрос. – inscaven

+0

Просьба указать критерии, используемые для определения, является ли «слишком широкая» матрица (моя презумпция была> 2) и подтвердить, что обработка «разделена на фиксированную ширину», как вы упомянули в своем сообщении. – Ricky