/* 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);
|
}
|