Correction of some bugs with the image processing and adding some tools for images

This commit is contained in:
Adrien Bourmault 2019-08-21 14:54:05 +02:00 committed by GitHub
parent 1c38f1c8b4
commit 4062d68b2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 68 additions and 29 deletions

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *
@ -138,7 +139,7 @@ french = \
"Coller :\t\t\t\tCtrl-V \n" "Coller :\t\t\t\tCtrl-V \n"
"Forcer une nouvelle détection du document :\tEchap\n", "Forcer une nouvelle détection du document :\tEchap\n",
"CHANGELOG" : "Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n\n" + \ "CHANGELOG" : "Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n- Correction de noms des documents\n- Résolution d'un problème avec le système de mise-à-jour\n- Amélioration des effets sur images\n\n" + \
"Version 3.1.1 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug sévère du système de mise à jour\n\n" + \ "Version 3.1.1 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug sévère du système de mise à jour\n\n" + \
"Version 3.1.0 \nMise-à-jour majeure avec les progressions suivantes :\n- Modifications cosmétiques de l'interface utilisateur\n- Stabilisation des changements effectués sur la version mineure 3.0 : interface utilisateur, OCR, VISA A et B, logging\n- Rationalisation du système de langues\n- Ajout des canaux de mise-à-jour\n\n" + \ "Version 3.1.0 \nMise-à-jour majeure avec les progressions suivantes :\n- Modifications cosmétiques de l'interface utilisateur\n- Stabilisation des changements effectués sur la version mineure 3.0 : interface utilisateur, OCR, VISA A et B, logging\n- Rationalisation du système de langues\n- Ajout des canaux de mise-à-jour\n\n" + \
"Version 3.0.8 finale\nCorrectif : bug du système de mise-à-jour'\n\n" + \ "Version 3.0.8 finale\nCorrectif : bug du système de mise-à-jour'\n\n" + \
@ -152,7 +153,8 @@ french = \
"Version 3.0.1 \nMise-à-jour majeure avec les corrections suivantes :\n- Renouvellement de la signature numérique de l'exécutable\n- Amélioration de présentation du log en cas d'erreur\n- Refonte totale du code source et désobfuscation\n- Téléchargements en HTTPS fiables avec somme de contrôle\n- Nouveaux terminaux d'entrées : un rapide (731) et un complet\n- Détection des documents améliorée, possibilité de choix plus fin\nEt les regressions suivantes :\n- Suppression temporaire de la fonction de lecture OCR. Retour planifié pour une prochaine version", "Version 3.0.1 \nMise-à-jour majeure avec les corrections suivantes :\n- Renouvellement de la signature numérique de l'exécutable\n- Amélioration de présentation du log en cas d'erreur\n- Refonte totale du code source et désobfuscation\n- Téléchargements en HTTPS fiables avec somme de contrôle\n- Nouveaux terminaux d'entrées : un rapide (731) et un complet\n- Détection des documents améliorée, possibilité de choix plus fin\nEt les regressions suivantes :\n- Suppression temporaire de la fonction de lecture OCR. Retour planifié pour une prochaine version",
"Document Review: {}\n\n" : "Examen du document : {}\n\n", "Document Review: {}\n\n" : "Examen du document : {}\n\n",
"Calculated {} [facultative]\n" : "Checksum position {}: Lu {} VS Calculé {} [facultatif]\n", "Checksum position {}: Lu {} "
"VS Calculated {} [facultative]\n" : "Checksum position {}: Lu {} VS Calculé {} [facultatif]\n",
"Checksum position {}: Lu {} VS " "Checksum position {}: Lu {} VS "
"Calculated {}\n" : "Checksum position {}: Lu {} VS Calculé {}\n", "Calculated {}\n" : "Checksum position {}: Lu {} VS Calculé {}\n",
"COMPLIANT" : "CONFORME", "COMPLIANT" : "CONFORME",
@ -185,6 +187,7 @@ french = \
"Titre d'identité/de voyage" : "Titre d'identité/de voyage", "Titre d'identité/de voyage" : "Titre d'identité/de voyage",
"Carte didentité européenne" : "Carte didentité européenne", "Carte didentité européenne" : "Carte didentité européenne",
"Certificat de membre d'équipage" : "Certificat de membre d'équipage", "Certificat de membre d'équipage" : "Certificat de membre d'équipage",
"Carte de séjour européenne" : "Carte de séjour européenne",
"Visa de type A" : "Visa de type A", "Visa de type A" : "Visa de type A",
"Visa de type B" : "Visa de type B", "Visa de type B" : "Visa de type B",
"Carte de séjour FR" : "Carte de séjour français", "Carte de séjour FR" : "Carte de séjour français",
@ -193,6 +196,13 @@ french = \
"Permis de conduire" : "Permis de conduire", "Permis de conduire" : "Permis de conduire",
"The file you provided is not " "The file you provided is not "
"valid : {}" : "Le fichier transmis n'est pas valide : {}", "valid : {}" : "Le fichier transmis n'est pas valide : {}",
"A critical error has occurred in "
"the OpenCV image processing "
"manager used by CNIRevelator. "
"Please be sure that the filename "
"does not contain any non unicode "
"character such as accent and "
"foreign characters." : "Une erreur critique s'est produite dans le gestionnaire de traitement d'images OpenCV utilisé par CNIRevelator. Veuillez vous assurer que le nom de fichier ne contient pas de caractères non unicode tels que des accents et des caractères étrangers.",
"LANDCODE2" : { "LANDCODE2" : {
'AW': 'Aruba', 'AW': 'Aruba',
@ -831,7 +841,7 @@ english = \
"Paste:\t\t\t\tCtrl-V\n" "Paste:\t\t\t\tCtrl-V\n"
"Force a new document detection:\tEchap\n", "Force a new document detection:\tEchap\n",
"CHANGELOG" : "Version 3.1.2 \nMinor update with the following progressions:\n- Upgrade Tesseract OCR to 5.0\n\n" + \ "CHANGELOG" : "Version 3.1.2 \nMinor update with the following progressions: \n- Tesseract OCR version upgrade : 5.0\n- Correction of document names\n- Fixed a problem with the update system\n- Some enhancements about effects on images\n\n" + \
"Version 3.1.1 \nMinor update with the following progressions: \n- Fixed a severe bug in the update system\n\n" + \ "Version 3.1.1 \nMinor update with the following progressions: \n- Fixed a severe bug in the update system\n\n" + \
"Version 3.1.0 \nMajor update with the following progressions: \n- Cosmetic modifications of the user interface \n- Stabilization of the changes made on the minor version 3.0 : user interface, OCR, VISA A and B, logging\n- Rationalization of the language system\n- Added update channels\n\n" + \ "Version 3.1.0 \nMajor update with the following progressions: \n- Cosmetic modifications of the user interface \n- Stabilization of the changes made on the minor version 3.0 : user interface, OCR, VISA A and B, logging\n- Rationalization of the language system\n- Added update channels\n\n" + \
"Version 3.0.8 final\nCorrection: bug in the update system'\n\n" + \ "Version 3.0.8 final\nCorrection: bug in the update system'\n\n" + \
@ -845,8 +855,8 @@ english = \
"Version 3.0.1 \nMajor update with the following corrections: \n- Renewal of the executable's digital signature- Improvement of the log presentation in case of error\n- Total overhaul of the source code and disobfuscation\n- Reliable HTTPS downloads with checksum\n- New input terminals : a fast (731) and a complete one\n- Improved document detection, possibility of finer choice and the following regressions:\n- Temporary deletion of the OCR reading function. Planned return for a next version", "Version 3.0.1 \nMajor update with the following corrections: \n- Renewal of the executable's digital signature- Improvement of the log presentation in case of error\n- Total overhaul of the source code and disobfuscation\n- Reliable HTTPS downloads with checksum\n- New input terminals : a fast (731) and a complete one\n- Improved document detection, possibility of finer choice and the following regressions:\n- Temporary deletion of the OCR reading function. Planned return for a next version",
"Document Review: {}\n\n" : "Document Review: {}\n\n", "Document Review: {}\n\n" : "Document Review: {}\n\n",
"Checksum position {}: Lu {} VS " "Checksum position {}: Lu {} "
"Calculated {} [facultative]\n" : "Checksum position {}: Read {} VS Calculated {} [facultative]\n", "VS Calculated {} [facultative]\n" : "Checksum position {}: Lu {} VS Calculated {} [facultative]\n",
"Checksum position {}: Lu {} VS " "Checksum position {}: Lu {} VS "
"Calculated {}\n" : "Checksum position {}: Read {} VS Calculated {}\n", "Calculated {}\n" : "Checksum position {}: Read {} VS Calculated {}\n",
"COMPLIANT" : "COMPLIANT", "COMPLIANT" : "COMPLIANT",
@ -877,6 +887,7 @@ english = \
"Passeport lisible à la machine" : "Machine Readable Passport", "Passeport lisible à la machine" : "Machine Readable Passport",
"Carte-passeport" : "Passport card", "Carte-passeport" : "Passport card",
"Carte didentité européenne" : "European identity document", "Carte didentité européenne" : "European identity document",
"Carte de séjour européenne" : "European Residence permit",
"Titre d'identité/de voyage" : "Identity/travel document", "Titre d'identité/de voyage" : "Identity/travel document",
"Certificat de membre d'équipage" : "Crew member certificate", "Certificat de membre d'équipage" : "Crew member certificate",
"Visa de type A" : "Type A visa", "Visa de type A" : "Type A visa",
@ -887,6 +898,13 @@ english = \
"Permis de conduire" : "Driver License", "Permis de conduire" : "Driver License",
"The file you provided is not " "The file you provided is not "
"valid : {}" : "The file you provided is not valid : {}", "valid : {}" : "The file you provided is not valid : {}",
"A critical error has occurred in "
"the OpenCV image processing "
"manager used by CNIRevelator. "
"Please be sure that the filename "
"does not contain any non unicode "
"character such as accent and "
"foreign characters." : "A critical error has occurred in the OpenCV image processing manager used by CNIRevelator. Please be sure that the filename does not contain any non unicode character such as accent and foreign characters.",
"LANDCODE2" : { "LANDCODE2" : {
"AW": "Aruba", "AW": "Aruba",

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *
@ -32,6 +33,7 @@ from tkinter import ttk
import threading import threading
from datetime import datetime from datetime import datetime
from importlib import reload from importlib import reload
import unicodedata
import re import re
import cv2 import cv2
import PIL.Image, PIL.ImageTk import PIL.Image, PIL.ImageTk
@ -229,7 +231,7 @@ class mainWindow(Tk):
self.toolbar.zoomOut50.grid(column=5, row=0) self.toolbar.zoomOut50.grid(column=5, row=0)
self.toolbar.invertImg = ImageTk.PhotoImage(PIL.Image.open("invert.png")) self.toolbar.invertImg = ImageTk.PhotoImage(PIL.Image.open("invert.png"))
self.toolbar.invert = ttk.Button(self.toolbar, image=self.toolbar.invertImg, command=self.negativeScan) self.toolbar.invert = ttk.Button(self.toolbar, image=self.toolbar.invertImg, command=self.threshScan)
self.toolbar.invert.grid(column=7, row=0) self.toolbar.invert.grid(column=7, row=0)
self.toolbar.rotateLeftImg = ImageTk.PhotoImage(PIL.Image.open("rotateLeft.png")) self.toolbar.rotateLeftImg = ImageTk.PhotoImage(PIL.Image.open("rotateLeft.png"))
@ -378,7 +380,7 @@ class mainWindow(Tk):
self.imageViewer.imagePath = None self.imageViewer.imagePath = None
self.imageViewer.imgZoom = 1 self.imageViewer.imgZoom = 1
self.imageViewer.rotateCount = 0 self.imageViewer.rotateCount = 0
self.imageViewer.blackhat = False self.imageViewer.blackhat = 0
self.imageViewer.pagenumber = 0 self.imageViewer.pagenumber = 0
# Some bindings # Some bindings
@ -418,10 +420,12 @@ class mainWindow(Tk):
if self.imageViewer.image: if self.imageViewer.image:
cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber] cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber]
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
if self.imageViewer.blackhat: if self.imageViewer.blackhat == 1:
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.GaussianBlur(cv_img, (3, 3), 0) cv_img = cv2.threshold(cv_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv_img = cv2.bitwise_not(cv_img) elif self.imageViewer.blackhat == 2:
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.medianBlur(cv_img, 3)
try: try:
# Get the image dimensions (OpenCV stores image data as NumPy ndarray) # Get the image dimensions (OpenCV stores image data as NumPy ndarray)
height, width, channels_no = cv_img.shape height, width, channels_no = cv_img.shape
@ -438,12 +442,12 @@ class mainWindow(Tk):
# Resize # Resize
dim = (int(width * (self.imageViewer.imgZoom + 100) / 100), int(height * (self.imageViewer.imgZoom + 100) / 100)) dim = (int(width * (self.imageViewer.imgZoom + 100) / 100), int(height * (self.imageViewer.imgZoom + 100) / 100))
cv_img = cv2.resize(cv_img, dim, interpolation = cv2.INTER_AREA) cv_img = cv2.resize(cv_img, dim, interpolation = cv2.INTER_AREA)
# Crop
x0 = int(self.corners[0][0]) x0 = int(self.corners[0][0])
y0 = int(self.corners[0][1]) y0 = int(self.corners[0][1])
x1 = int(self.corners[1][0]) x1 = int(self.corners[1][0])
y1 = int(self.corners[1][1]) y1 = int(self.corners[1][1])
crop_img = cv_img[y0:y1, x0:x1] crop_img = cv_img[y0:y1, x0:x1]
# Get the text by OCR # Get the text by OCR
@ -807,10 +811,10 @@ class mainWindow(Tk):
# Load an image using OpenCV # Load an image using OpenCV
self.imageViewer.imagePath = path self.imageViewer.imagePath = path
self.imageViewer.imgZoom = 1 self.imageViewer.imgZoom = 1
self.imageViewer.blackhat = False self.imageViewer.blackhat = 0
self.imageViewer.rotateCount = 0 self.imageViewer.rotateCount = 0
self.imageViewer.pagenumber = 0 self.imageViewer.pagenumber = 0
# Determine how many pages # Determine how many pages
self.toolbar.pageChooser['values'] = ('1') self.toolbar.pageChooser['values'] = ('1')
total = len(cv2.imreadmulti(self.imageViewer.imagePath)[1]) total = len(cv2.imreadmulti(self.imageViewer.imagePath)[1])
@ -819,8 +823,12 @@ class mainWindow(Tk):
self.toolbar.pageChooser['values'] += tuple(str(i)) self.toolbar.pageChooser['values'] += tuple(str(i))
# Open the first page # Open the first page
cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber] try:
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber]
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
except:
logfile.printerr("Error with : {} in {} with total of {} pages".format(cv2.imreadmulti(self.imageViewer.imagePath), self.imageViewer.imagePath, total))
showerror(lang.all[globs.CNIRlang]["OpenCV error (image processing)"], lang.all[globs.CNIRlang]["A critical error has occurred in the OpenCV image processing manager used by CNIRevelator. Please be sure that the filename does not contain any non unicode character such as accent and foreign characters."] + "\n\n" + self.imageViewer.imagePath)
try: try:
# Get the image dimensions (OpenCV stores image data as NumPy ndarray) # Get the image dimensions (OpenCV stores image data as NumPy ndarray)
@ -895,7 +903,7 @@ class mainWindow(Tk):
self.imageViewer.rotateCount = 4 self.imageViewer.rotateCount = 4
self.resizeScan() self.resizeScan()
def negativeScan(self): def threshScan(self):
""" """
Invert the bits to make a negative of the scan (and highlight the contrasts) Invert the bits to make a negative of the scan (and highlight the contrasts)
""" """
@ -903,13 +911,16 @@ class mainWindow(Tk):
# Load an image using OpenCV # Load an image using OpenCV
cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber] cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber]
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
if not self.imageViewer.blackhat: if self.imageViewer.blackhat == 0:
self.imageViewer.blackhat = True self.imageViewer.blackhat = 1
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.GaussianBlur(cv_img, (3, 3), 0) cv_img = cv2.threshold(cv_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv_img = cv2.bitwise_not(cv_img) elif self.imageViewer.blackhat == 1:
self.imageViewer.blackhat = 2
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.medianBlur(cv_img, 3)
else: else:
self.imageViewer.blackhat = False self.imageViewer.blackhat = 0
self.resizeScan(cv_img) self.resizeScan(cv_img)
def resizeScan(self, cv_img = None): def resizeScan(self, cv_img = None):
@ -922,10 +933,12 @@ class mainWindow(Tk):
# Load an image using OpenCV # Load an image using OpenCV
cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber] cv_img = cv2.imreadmulti(self.imageViewer.imagePath)[1][self.imageViewer.pagenumber]
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
if self.imageViewer.blackhat: if self.imageViewer.blackhat == 1:
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.GaussianBlur(cv_img, (3, 3), 0) cv_img = cv2.threshold(cv_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv_img = cv2.bitwise_not(cv_img) elif self.imageViewer.blackhat == 2:
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
cv_img = cv2.medianBlur(cv_img, 3)
try: try:
# Get the image dimensions (OpenCV stores image data as NumPy ndarray) # Get the image dimensions (OpenCV stores image data as NumPy ndarray)
@ -948,12 +961,11 @@ class mainWindow(Tk):
self.DisplayUpdate( photo) self.DisplayUpdate( photo)
except Exception as e: except Exception as e:
logfile.printerr("Error with opencv : {}".format(e)) logfile.printerr("Error with opencv : {}".format(e))
critical.crashCNIR()
try: try:
# Reload an image using OpenCV # Reload an image using OpenCV
path = self.imageViewer.imagePath path = self.imageViewer.imagePath
self.imageViewer.imgZoom = 1 self.imageViewer.imgZoom = 1
self.imageViewer.blackhat = False self.imageViewer.blackhat = 0
self.imageViewer.rotateCount = 0 self.imageViewer.rotateCount = 0
cv_img = cv2.imreadmulti(path) cv_img = cv2.imreadmulti(path)
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB) cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
@ -966,7 +978,6 @@ class mainWindow(Tk):
self.DisplayUpdate(photo) self.DisplayUpdate(photo)
except Exception as e: except Exception as e:
logfile.printerr("Critical error with opencv : ".format(e)) logfile.printerr("Critical error with opencv : ".format(e))
critical.crashCNIR()
showerror(lang.all[globs.CNIRlang]["OpenCV error (image processing)"], lang.all[globs.CNIRlang]["A critical error has occurred in the OpenCV image processing manager used by CNIRevelator, the application will reset itself"]) showerror(lang.all[globs.CNIRlang]["OpenCV error (image processing)"], lang.all[globs.CNIRlang]["A critical error has occurred in the OpenCV image processing manager used by CNIRevelator, the application will reset itself"])
self.initialize() self.initialize()

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *
@ -121,7 +122,7 @@ TSEUR = [
"C": ["11", "FACULT", ".+"], "C": ["11", "FACULT", ".+"],
"D": ["1", "CTRL", "[0-9]", "345679AC"] "D": ["1", "CTRL", "[0-9]", "345679AC"]
}, },
lang.all[globs.CNIRlang]["Carte didentité européenne"] lang.all[globs.CNIRlang]["Carte de séjour européenne"]
] ]
AC = [ AC = [

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *

View File

@ -1,3 +1,4 @@
# -*- coding: utf8 -*-
""" """
******************************************************************************** ********************************************************************************
* CNIRevelator * * CNIRevelator *