Development of the ocr part of AOI
Samo Penic
2019-06-11 5d557801d61beb4970ffc4c62ba81cd0cd76db68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* EDIT: Explain what this source file does
   Copyright (C) 2019 Samo Penic.
 
   This file is part of Sizif.
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
#include <leptonica/allheaders.h>
#define   DESKEW_REDUCTION      4 
 
PIX *loadimage(char *filename){
    PIX *pix, *pixt;
    int format, bpp;
/*    format=fileformat(filename);
        // In later versions of leptonica you will have to do this 
        // pixReadHeader(filename, format,NULL,NULL,NULL,bpp,NULL);
    if(format!=IFF_PNG && format!=IFF_JFIF_JPEG && format!=IFF_TIFF && format!=
IFF_GIF && format!=7 && format!=8){
        dfprintf(stderr,"Not recognised file format %i", format);
        return NULL;
    } */
    if ((pix = pixRead(filename)) == NULL) return NULL;
 
/* TODO: convert image to 1-bpp 300dpi regardless of scan */
    bpp=pixGetDepth(pix);
    if(bpp>1){
    /*
        printf("Bits per pixel=%i",bpp);
        exit(1); */
        //pixThresholdForFgBg(pix,5,100,NULL,NULL);
        //pixContrastTRC(pix, pix, 1000);
        pixt = pixContrastNorm(NULL, pix, 10, 10, 40, 2, 2);
        pixDestroy(&pix);
        pix = pixGammaTRC(NULL, pixt, 1.5, 50, 235);
        pixt=pixThresholdToBinary(pix, 200);
        //pixt=pixThreshold8(pix,1,1,0);
        pixDestroy(&pix);
        pix=pixt;
    }
   return pix; 
}
 
PIX *lineremoval(PIX *pixs){
    PIX *pixd = pixMorphCompSequence(pixs, "o2.2", 0); /* Odstranimo pikice o2.2*/
    return pixd;
}
 
float deskew(PIX *pix){
    float angle;
    PIX *pixd1;
    pixd1=pixFindSkewAndDeskew(pix, DESKEW_REDUCTION, &angle, NULL);
    return angle;
}
 
 
float repair_scanned_image(PIX *pixs){
    PIX *pixd= lineremoval(pixs);
    float angle=deskew(pixd);
    return angle;
}
 
float get_scan_angle(char *filename){
    PIX *pix=loadimage(filename);
    if (pix==NULL) return 0.0;
    return repair_scanned_image(pix);
}