Jag har ett praktiskt problem som kanske inte är så teoretiskt men jag skulle ändå behöva lite hjälp från er smarta matematiker på hur man kan lösa det smidigt utan alltför mycket antaganden.
Bakgrund:
Jag håller på med en modell som läser in tabeller från scannade PDFer (OCR) och vill ställa upp dom i Excel eller valfri databas.
OCR-processen skapar en rektangel runt varje ord / siffra som jag får ut i en fil när den har läst klart. I min outputfil får jag ut x0,y0,x1,y1 för varje rektangel och kan på så vis veta exakt vart i dokumentet varje element hör hemma.
Problem 1:
Scannade dokument är aldrig exakta så det kan skilja några punkter/pixlar fastän de ska vara på samma rad.
Output:
text [x0 y0 x1 y1]
ex:
Solen [x0 60 x1 65] (ska vara på rad 1)
skiner [x0 62 x1 67] (ska vara på rad 1)
Molnigt [x0 100 x1 105] (ska vara på rad 2)
idag [x0 102 x1 105] (ska vara på rad 2)
ABC [x0 400 x1 405] (ska vara på rad 3)
DEF [x0 402 x1 405] (ska vara på rad 3)
Nu har jag löst det manuellt genom att låta varje rad ha en felmarginal på säg 10 pixlar/punkter för att sortera datan rätt på raderna.
Eftersom mina dokument kan ha lite olika typsnitt / radavstånd så skulle jag hellre vilja lösa det genom en metod som inte förlitar sig på just 10 pixlar.
Om man plottar upp det i ett stapeldiagram så ser det ut ungefär som en trappa, där varje "trappsteg" kan skilja sig lite på grund av att y-positionen inte är exakt. Dessutom får varje trappsteg olika höjd beroende på om det är en tom rad mellan raderna eller inte.
Det jag vill göra är att dela upp det i bins med dynamiska ranges, ex rad 1 ska ligga i bin 1 som täcker rangen 60 +- felmarginal.
Alla rader ligger inte efter varandra, ibland är det en tom rad / radbrytning mellan raderna och det här vill jag också fånga upp.
Om jag tittar på mitt dataset just nu kan det se ut såhär:
Linje 1 (felmarginal kan vara ~10 pixlar från average y på den linjen)
Linje 2 (felmarginal kan vara ~8 pixlar från average y på den linjen)
(blank rad)
Linje 3 (felmarginal kan vara ~10 pixlar från average y på den linjen)
Linje 4 (felmarginal kan vara ~8 pixlar från average y på den linjen)
Deltat mellan linje 1 & 2 samt 3/4 kan vara runt 100 pixlar
Deltat mellan linje 2 & 3 (en tom rad emellan) kan vara runt 300 pixlar.
Min fråga är egentligen är om ni har några idéer på hur man kan räkna ut felmarginalen som man ska tillåta per varje rad samt om man kan gruppera datan på något elegant sett?
(Jag förklarar gärna mer om något är oklart...)