Saltar al contenido

Extraer tabla de imagen

No olvides que en las ciencias informáticas un problema casi siempere suele tener diversas soluciones, pero nosotros aquí mostramos lo más óptimo y eficiente.

Solución:

Aquí hay una forma:

data = [email protected]@"http://i.stack.imgur.com/NQr6I.png";

points=ComponentMeasurements[ MorphologicalComponents[Sharpen[Dilation[[email protected],1.5],1]] ,"Centroid"][[All,2]];
box=ComponentMeasurements[ MorphologicalComponents[Sharpen[Dilation[[email protected],1.5],1]] ,"BoundingBox"][[All,2]];

posX,posY=Mean/@Split[#,If[Abs[#1-#2]<5,True,False]&]&/@[email protected][[All,1]],[email protected][[All,2]]

Podemos ver que la posición de la cuadrícula funcionó en esta gráfica:

ListPlot[points,PlotRange->All,GridLines->posX,posY,PlotStyle->Red]

ingrese la descripción de la imagen aquí

Ahora hagamos la partición de la imagen:

imagePartition = ParallelMap[ImageTrim[[email protected]
, #] &, box];

Aquí hay una muestra:

imagePartition[[;; 15]]

ingrese la descripción de la imagen aquí

Ahora, la parte que debe mejorarse, aquí hay un intento de reconocer los números.

getNumber[img_]:=Module[r,comp,
    comp=ComponentMeasurements[img,"PerimeterCount","Holes"][[All,2]];
    r=Which[
            [email protected]#==2,-1
            ,#[[1,2]]==1,0
            ,#[[1,1]]<15,1
            ,True,2
        ]&[comp];
    (*r,comp,img*)
    r
]

Dos elementos encuentran -1, un agujero encuentra 0, ningún agujero con perímetro <15 encuentra 1 y el resto es 2.

Aplicándolo partición de datos como:

numberData=Partition[ParallelMap[getNumber,imagePartition],[email protected]]//MatrixForm

Obtenemos:

Grid[numberData,Spacings->0,Alignment-> NumberPoint,Dividers->LightGray,BaseStyle->FontSize-> 11]

ingrese la descripción de la imagen aquí

No es perfecto, pero puede ser un punto de partida. Es solo mejorar getNumber.

Actualizar

Con algo de calibración en getNumber y usando Binarize en lugar de Sharpenahora todos los casos están bien.

TextRecognize funciona bien después de algunos ajustes y correcciones de errores:

x = Import["http://i.stack.imgur.com/NQr6I.png"];
res = TextRecognize[Binarize[ImageResize[x, Scaled[5]], 0.7],"SegmentationMode" -> 6];

m = ToExpression /@ StringSplit[#] & /@ 
   StringSplit[
    StringReplace[
     res,  "D" ], 
    "n"];

m // MatrixForm

ingrese la descripción de la imagen aquí

He usado la opción no documentada "SegmentationMode" -> 6.

Reseñas y valoraciones

Tienes la opción de añadir valor a nuestro contenido informacional aportando tu veteranía en las ilustraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *