Cet article fait suite à l’article qui expliquant comment utiliser la librairie Python deskew pour redresser des images qui ne sont malheureusement pas droite. Je ne vais donc pas expliquer comment utiliser cette librarie mais plutôt vous montrer comment l’utiliser dans un automate Blue Prism afin d’automatiser ce type de tâche.
Pour ce faire nous allons :
- Créer un Web service (REST) qui expose la fonction de redressement d’image.
- Déclarer dans Blue Prism ce nouveau service
- Créer un objet (VBO) Blue Prism qui encapsulera cette fonction
Ces étapes réalisées, il sera très simple de créer autant de Processus Blue Prism que vous le voulez afin de pouvoir redresser des images.
Création du Web Service
Avec Python et Flask nous allons créer en quelques lignes de code un web service REST qui expose une méthode deskew. Voici le code Python qui effectue le redressement:
import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
import jsonpickle
import cv2
from flask import Flask, request, Response
app = Flask(__name__)
# deskew image
def deskew_image(image):
trace("Deskew Image")
#image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, resize=True) * 255
return rotated.astype(np.uint8)
# Check
@app.route('/check', methods=['GET'])
def check():
output = {}
output['status'] = "Service running"
response_pickled = jsonpickle.encode(output)
return Response(response=response_pickled, status=200, mimetype="application/json")
@app.route('/deskew', methods=['POST'])
def deskew():
output = {}
# Get destination filename
targetfile = request.args.get("targetfile")
# Get binary file, convert string of image data to uint8 and decode image
data = request.data
nparr = np.frombuffer(data, np.uint8)
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
image_out = deskew_image(image)
cv2.imwrite(targetfile, image_out)
output['status'] = "Saved"
# Prepare response, encode JSON to return
response_pickled = jsonpickle.encode(output)
return Response(response=response_pickled, status=200, mimetype="application/json")
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=8090)
Sauvegardez ce code dans un fichier xxx.py et lancer le en ligne de commande via :
$ python xxx.py
Normalement vous devriez avoir un résultat de ce type:

Celà signifie que le Web service est à l’écoute. Si ce n’est pas le cas c’est qu’il vous manque certainement des librairies Python. Reparcourez les articles mentionnés plus haut afin de vérifier qu’ils ont tous été importés avec pip ou conda.
Vous remarquerez que ce web service possède deux méthodes :
- /check qui permettra à l’Objet (VBO) Blue Prism de vérifier que le Web Service est bien à l’acoute et si ce n’est pas le cas de le lancer.
- /deskew qui permet de faire le redressement de l’image. Le code de ce service est à peu près celui décrit dans l’article sur le redressement d’image.
Déclaration du service dans Blue Prism
La déclaration ou le référencement de web service dans Blue Prism est extrêmement simple et se fait de manière totalement graphique. Pour cela ouvrez le client Blue Prism et allez dans System, puis cliquez sur Web API Services :
Ajoutez un service en cliquant sur le lien à droite : « Add Service ». Maintenant vous devez configurer les informations et interfaces de votre service avec l’assistant. Précisez tout d’abord le nom et l’URL du service (Cf. Flask ci dessus) :
Référencement de l’action /check
Ensuite, sélectionnez les actions (ou méthodes) et ajoutez la première qui permet de vérifier que le service est lancé (check) :
Ajoutez le nom de l’action et activez là (enabled) :
Cette action n’a pas de parametre. Cliquez sur Request pour préciser comment appeler cette méthode et entrez /check dans le champ « URL Path ».
Cliquez ensuite sur la réponse (response) du service pour préciser les éléments renvoyés par cette action. Remplissez comme suit :
Référencement de l’action /deskew
Maintenant nous allons référencer de la même manière l’action de redressement. Le principe est le même à ceci pret que ce service demande en entrée un fichier (binaire) et un paramètre (le nom du fichier dans lequel sera placé l’image redressée).
Créons tout d’abor une nouvelle action : deskew.
Dans la section Parametre nous allons préciser un seul parametre « targetfile » (le fichier binaire n’est pas considéré comme un parametre car il est envoyé via la méthode HTTP POST).
Dans la partie Request nous devons préciser plusieurs choses :
- La méthode HTTP : ici obligatoirement POST
- Comment le parametre est utilisé dans la requete http (sa syntaxe) : /deskew?targetfile=[targetfile]
- Préciser que le corps (body) du message contient un fichier unique (single file)
Il ne reste plus qu’à préciser les éléments renvoyés par le service :
Voilà c’est pas plus compliqué que ça, il reste maintenant à créer un objet qui utilisera ce service.
Création de l’Objet Blue Prism
Pour cela créez un Objet dans Blue Prism (ici je le nomme pyImageUtils :
Une fois créé, ajoutez simplement une action. Je l’appelerai ici deskew. Cette action Blue Prism a pour données en entrée :
- Le fichier au format binaire à redresser (Variable Image)
- Le nom du fichier qui contiendra l’image redressée.
Ce sont exactement les mêmes points d’entrées que le Web Service plus haut. En sortie nous renverrons un simple message précisant si tout s’est bien passé ou pas.
Voici à quoi ressemble l’action dans Blue Prism:
On retrouve dans la partie haute le début de l’action avec les deux paramètres (image et fichier de destination). Ensuite après avoir démarré le service (via la ligne de commande ci-dessus), on demande l’exécution de la méthode deskew du web service. Celà est fait via une simple configuration de l’action « deskew » ci-dessus :
Voilà le service est maintenant opérationnel et maintenu par un Objet réutilisable Blue Prism.
Essayons le !
En mode debug avec Blue Prism celà ne va prendre que quelques secondes. Pour faire l’essai tout d’abord on doit préciser les parametres d’entrée du service :
- Double Cliquez sur le « Data Item » Image et sélectionnez une image. Je vais prendre celle ci-dessous:
- Préciser ensuite un nom de fichier : par exemple C:\BP Assets\services\imageutils\test2.jpg
Lancez le processus.
Regardez le fichier de résultat …
Voilà vos Robots ou processus Blue Prism bénéficient maintenant d’une nouvelle compétence qui leur permet de redresser des images.
Vous pouvez télécharger tous les composants nécéssaires à cette compétence sur Github.
Ingénieur en informatique avec plus de 20 ans d’expérience dans la gestion et l’utilisation de données, Benoit CAYLA a mis son expertise au profit de projets très variés tels que l’intégration, la gouvernance, l’analyse, l’IA, la mise en place de MDM ou de solution PIM pour le compte de diverses entreprises spécialisées dans la donnée (dont IBM, Informatica et Tableau). Ces riches expériences l’ont naturellement conduit à intervenir dans des projets de plus grande envergure autour de la gestion et de la valorisation des données, et ce principalement dans des secteurs d’activités tels que l’industrie, la grande distribution, l’assurance et la finance. Également, passionné d’IA (Machine Learning, NLP et Deep Learning), l’auteur a rejoint Blue Prism en 2019 et travaille aujourd’hui en tant qu’expert data/IA et processus. Son sens pédagogique ainsi que son expertise l’ont aussi amené à animer un blog en français (datacorner.fr) ayant pour but de montrer comment comprendre, analyser et utiliser ses données le plus simplement possible.
Bonjour, et merci pour cet article.
Vers quelles librairies puis je me tourner si je veux ajouter des traitements supplémentaires à savoir :
Détection d’une feuille blanche pour éviter de faire ce traitement.
Détection d’une feuille à l’envers et rotation à 180 ° si nécessaire.
Et enfin, je souihaiterais dans le cadre de scan de livre effectuer une translation sur mes pages afin que la position de ma marge soit la même d’une feuille à l’autre.
Avec mes remerciements
Bonjour,
3 besoins interressants et justifiés (pour info BluePrism Decipher 1.1 couvre deja le 2eme). pour la feuille blanche, je pense qu’il faudrait entrainer un modele dédié a cela. Pour ton 3 eme besoin je pense qu’il faudrait réutiliser openCv pour la detection de bord (un peu comme cela est fait pour le deskewing). Il y a certainement pleins d’autres moyens de le faire …
Benoît