PROJET AUTOBLOG ~ Streisand Effect


sciunto

Site original : sciunto

⇐ retour index

Manuscript : Scikit-image : Traitement d'images en Python

Monday 31 March 2014 à 00:00

Scikit-image est une bibliothèque de traitement d'images en Python. Nous venons de soumettre un manuscript à PeerJ dont le PrePrint est téléchargeable. EDIT: et le papier publié est ici version finale.

Je suis très heureux d'avoir eu l'occasion de participer à la rédaction de ce manuscript où j'ai pu illustrer un code utilisé à des fins de recherche académique dont j'ai implémenté l'algorithme dans la bibliothèque. L'histoire a voulu qu'ayant en tête cette application précise, j'ai cherché un algorithme et ne trouvant pas une implémentation qui me plaisait en Python, j'en ai proposé une à scikit-image. J'en parlais il y a un an dans cet article (transformée de Hough). La boucle est bouclée !

J'ai aussi écrit la partie "getting started" pour découvrir la bibliothèque en douceur, si vous ne la connaissez pas.

Le manuscript a l'avantage de présenter des cadres divers d'utilisation de scikit-image, grâce à la diversité des auteur(e)s. On trouve de la recherche en biologie, une application en entreprise pour détecter des défauts sur des surfaces, l'utilisation de la bibliothèque dans l'enseignement et enfin, une belle illustration du recollement d'images, le résultat est vraiment impressionnant.

Outre ces usages, on mets en avant le fait que scikit-image s'appuie fortement sur NumPy, ce qui permet facilement d'appliquer d'autres algo disponibles dans SciPy, Scikit-learn, etc.

C'est la première fois que j'écris un papier de manière collaborative avec git et le mécanisme de pull requests de github, et je dois dire que c'est très efficace. Le commentaire ligne à ligne avant l'inclusion permet d'atteindre très rapidement un document de qualité. Merci aux co-auteurs pour cette expérience !

Pourquoi je soutiens l'April

Saturday 8 February 2014 à 00:00

L'April est une association pionnière en matière de Logiciel Libre. Créée en 1996, elle était une association d'informaticiens souhaitant promouvoir le Logiciel Libre, inspirée par l'éthique du discours de Richard Stallman.

Un peu comme pour des codes sources, certains sont oubliés, d'autres au contraire savent évoluer et s'ouvrir au monde. Ce dernier est à mon sens le cas de l'April. Un premier tournant fût la loi DADVSI qui souleva des réactions face aux atteintes qui pouvaient être portées aux Logiciels Libres (Ref).

La prise de conscience qu'il ne suffisait pas de promouvoir le Logiciel Libre mais aussi veiller à sa défense, a entraîné une croissance significative du nombre d'adhérents pour dépasser les 5000 en 2009. Outre les personnes physiques qui se sentent concernées, ce sont aussi des personnes morales : entreprises, associations ou des communes comme Toulouse qui rejoignent l'April.

Grâce à ses membres et aux permanents, les actions menées par l'April se sont succédées et multipliées depuis. DADVSI n'étant que le premier du nom, l'April a poursuivi ses actions sur les brevets logiciels, l'hadopi, la lopsi, l'acta... mais l'April sait aussi planter des graines. Elle est l'initiatrice et la coordinatrice de Libre en fête, elle se tourne vers les autres associations et vers la diversité, informe le citoyen sur la position des candidats aux élections ou oeuvre pour une education à l'informatique plus saine. L'April sait rassembler au-delà des frontières de l'informatique et c'est ce qui en fait une grande association.

J'ai eu la chance de côtoyer (la distance ne me le permettant plus) physiquement un certain nombre de bénévoles ainsi que l'équipe de permanents et je peux témoigner de la qualité de l'esprit et du savoir de ces personnes. Le travail abattu est immense tant les projets sont nombreux.

J'oublie bien sûr des facettes de l'April, je ne cite que celles qui me marquent le plus. Néanmoins, ce sont les raisons pour lesquelles je soutiens l'April.

Aujourd'hui, le Logiciel Libre doit réfléchir à de nouvelles problématiques : protection des données personnelles, informatique en nuage avec la variété de concept que cela contient, matériel libre et fablab, etc. Je suis certain que l'April saura trouver un chemin dans ces questions.

L'April a aussi besoin de votre soutien. Un membre de plus, c'est une voix de plus lors d'une prise de parole. C'est aussi permettre un travail continu de veille et d'expertise grâce aux salariés.

Pour ceux qui veulent donner de leur temps (à toutes les échelles), l'April est prête à recevoir. D'expérience, l'association étant assez imposante, il faut savoir prendre son temps pour prendre ses marques, il y a de la place pour tou(te)s et c'est véritablement enrichissant !

Page de la campagne d'adhésion

Ce que python m'a enseigné

Tuesday 4 February 2014 à 00:00

Il y a près de deux ou trois ans, je suis passé à Python. A l'époque, je cherchais un langage permettant de scripter des tâches courantes (adminsys, utilitaires...). De Bash, je suis passé à perl qui m'a beaucoup séduit par l'expression du code et ses regexp. Il possède aussi beaucoup de bibliothèques (cf cpan), ce qui le rend intéressant.

Néanmoins, perl ne rime pas vraiment avec science, en tout cas dans mon domaine (il semble que perl ait une bonne communauté chez les bioinformaticiens). Matlab fait largement référence, mais puisque ce n'est pas éthiquement acceptable, je me suis tourné vers python qui se défend très bien. Il se trouve aussi que Python, contrairement à matlab, est un vrai langage de programmation, utilisé par des développeurs pour faire des outils bureau et web. C'est, selon moi, une (et non pas la) raison pour laquelle ce langage devrait être privilégié par rapport à matlab dans l'enseignement car il s'adresse potentiellement à une plus grande diversité de tâches, donc un plus large public.

Mais ce n'est pas ce que je veux traiter dans cet article, je veux plutôt parler de ce que Python m'a apporté et que je n'ai pas découvert au cours de mes études où j'ai appris C et C++.

Ces éléments, je les ai appris ou perfectionné avec python. Je ne dis pas que je ne l'aurais pas appris autrement, mais le fait est que c'est grâce à Python !

Supprimer la première page d'un pdf avec pyPDF2

Sunday 2 February 2014 à 00:00

Dans mon travail de recherche, je manipule beaucoup de PDF dont ceux provenant des sites des journaux scientiques. Le problème est qu'un certain nombre de ces journaux mettent une page "de couverture" au PDF à partir de métadonnées et cette page m'ennuie à plusieurs égards :

Pour toutes ces raisons, à chaque fois que j'ai un tel PDF entre les mains, je déchire la première page. Il y a sans doute des commandes ghostscripts magiques pour ça. Ici, je propose d'écrire un petit script python dont voici les sources.

C'est terriblement simple :

# Creation d'un fichier temporaire
tmp = tempfile.NamedTemporaryFile()
shutil.copy(filename, tmp.name)

# On ouvre le pdf et on compte les pages
output_file = PdfFileWriter()
input_file = PdfFileReader(open(tmp.name, 'rb'))
num_pages = input_file.getNumPages()

# On esquive la page 0, le reste, on copie
for i in range(1, num_pages):
    output_file.addPage(input_file.getPage(i))

# On ferme, on enregistre
tmp.close()
outputStream = open(filename, "wb")
output_file.write(outputStream)

Voilà, le travail est fait :)

Assembler des images avec PIL ou Pillow

Wednesday 8 January 2014 à 00:00

J'ai présenté il y a quelques mois l'utilisation de PIL ou Pillow pour retailler ou "croper" des images.

Pour rappel, Pillow est un fork amical de PIL, dans le but de dynamiser son développement. Aujourd'hui les distributions GNU/Linux majeures sont passées à Pillow. La documentation de Pillow était d'ailleurs encore assez horrible il y a quelques mois et je viens de découvrir que ça s'est grandement amélioré :)

Ici, je vais vous présenter une autre fonction intéressante qui me permet de réaliser des séquences d'images pour retranscrire par exemple une dynamique dans une image.

from PIL import Image

def make_sequence(filenames, output):
    """
    Make a sequence of N pictures

    :params filenames: tuple of filenames
    :params output: output filename
    """
    # Open the picture and get its size
    im1 = Image.open(filenames[0])
    x1, y1 = im1.size

    # Prepare the new picture
    new = Image.new("RGB", (len(filenames)*x1,y1), "Black")
    # Paste each picture of the tuple on the new picture
    for i, im in enumerate(filenames):
        image = Image.open(im)
        new.paste(image, (i*x1, 0))

    # Save the picture
    new.save(output)

On peut aussi avoir besoin de mettre un étalon. Pour celà, on applique un carré blanc (le fond étant noir dans mon cas). On utilise là aussi la fonction paste.

sc1 = Image.new("RGB", (scale1, 10), "White")
new.paste(sc1, (0+50, y1-50))

Une autre fonction pouvant être utile dans ce genre de scripts est la rotation des images :

im.rotate(-1.4, Image.BICUBIC)

Une valeur négative signifie une rotation horraire. Trois méthodes sont possibles : NEAREST, BILINEAR et BICUBIC

J'ai remarqué être confronté souvent à ce même genre de petites tâches, parfois sur des masses de données importantes (comme quelques Go de photos), parfois pour des choses où je veux garder une tracabilité de ce que j'ai fait de manière à pouvoir modifier et rejouer le processus rapidement. Il doit y avoir des logiciels graphiques très performants, mais ces codes sont très flexibles et avec le temps, la banque de snippets permet de couvrir rapidement les besoins.