Introduction au traitement d'image avec le format NETPBM

Introduction au traitement d'image avec le format NETPBM

a marqué ce sujet comme résolu.

Tout le monde se secoue ! :D

J'ai commencé (il y a 9 minutes) la rédaction d'un tutoriel au doux nom de « Introduction au traitement d'image avec le format NETPBM » et j'ai dans l'objectif de proposer en validation un texte aux petits oignons. Je fais donc appel à votre bonté sans limite pour dénicher le moindre pépin, que ce soit à propos du fond ou de la forme. Vous pourrez consulter la bêta à votre guise à l'adresse suivante :

Merci !


Voilà, je pose ça là. Ca parle de python, de traitement d'images et de filtres de convolution. Il manque une petite section sur l'interpolation linéaire et deux trois images. Mais sinon on doit pas être loin du compte ;)

Merci d'avance :)

+0 -0

C'est un tutoriel assez intéréssant car il présente quelques techniques de manipulation d'image qui sont routinnières dans les programmes de traitement (Gimp, 'Toshop,…). Par contre, si c'est pour faire des opérations sur des matrices, je sais pas à quel point l'utilisation de numpy te simplifierai la vie :)

Salut,

Quelques remarques :

  • Je ne vois pas pourquoi tu parle de ce format. Le format de stockage dans le traitement d'image c'est anecdotique. Tu peux effectivement parler des fonctions de conversions qui sont simple (et du coup pratique pour les tests) mais en soit tout ce qui vient après la partie "À la découverte du format NETPBM" n'a rien a voir avec le format. N'importe quel format d'image fournirait le même type de résultat. Je pense que tu devrais revoir ton titre et ton intro. Tu peux parler du format que tu va utiliser mais en soit le reste c'est du traitement d'image indépendant du format.
  • Je suis assez surpris car tu as fais un gros travail, le cours est assez long mais je suis circonspect de ta volonté de vouloir ré-inventer la roue. Le code n'est pas très pythonic (tu ferais pas du C d'habitude ?). Surtout c'est un code qui va être très lent. Avec PIL et/ou numpy tu réduirai de 80% le nombres de ligne en utilisant numpy et ton code serait executer 100 fois plus rapidement. Cela te permettrait de te concentrer sur la partie importante : les algos de traitement, et non pas sur les détails d'implémentations.

    C'est d'autant plus important, je pense, car dans la vrai vie personne ne va écrire du code comme le tient. Ça serait beaucoup trop lent et inefficace.

Quelques exemples de ton code que je reprend pour que tu puisse comparer :

Ouverture/sauvegarde d'images

1
2
3
4
5
import scipy.misc
import numpy as np

im = scipy.misc.imread("boot.pgm")
scipy.misc.imsave("out.pgm", im)

Jouer avec la luminosité

1
2
im += 50
im = np.clip(im, 0, 255)

Jouer avec le contraste

(au passage dans ton code tu utilise round qui fournit un float et non un int !

1
im = np.clip(np.round(im*1.3).astype(int), 0, 255)

Seuillage

1
2
3
4
# On peut aussi utiliser scipy.stats.threshold si on veut
mask = im > 200
im[mask] = 200
im[~mask] = 50

Je ne vais pas tout faire mais je pense que tu aurais plus intéret à utiliser numpy. Ça n'a pas de sens en Python de faire du traitement d'image "à la main" comme tu le fais et c'est dommage, tu perd du temps à discuter de bricoles d'implémentations alors que le plus important c'est parler des opérations.

Bon courage.

J'ai pas encore lu, juste pour rebondir sur ça :

Par contre, si c'est pour faire des opérations sur des matrices, je sais pas à quel point l'utilisation de numpy te simplifierai la vie :)

Pour le faire actuellement (dans le cadre de mon boulot), ça simplifie grandement la vie. Toute les opérations de type dilatation, convolution et cie se font en une fonction. Ça marche vraiment tout seul. Et je n'utilise qu'une infime partie de ce que scipy me propose.

Après, d'un point de vue pédagogique, faire les choses à la main se conçoit tout à fait.

+0 -0

Merci pour vos remarques.

Alors pour le choix du format, je trouve ça assez intéressant car ça permet de voir les pixels. Certes j'aurais pu appuyer le tuto sur n'importe quel format, mais je trouve ça intéressant d'expliquer aussi des choses comme la problématique de stockage, etc.

Concrétement le code, pas très pythonic, j'entend volontier ta remarque. Je ne pratique pas la C (ou en tout cas pas depuis longtemps), mais il est vrai que je ne suis pas très familier avec le python. Il y a peut être beaucoup de chose à revoir avec ça… Onèest bien d'accord que dans la vraie vie personne n'aurait une telle approche, mais pour moi ce n'était pas vraiment le point du tuto. Mon objectif était plutot de faire comprendre le méchanisme derrière chaque opération.

Je voit bien l'iètéret de Pil et/ou Numphy dans ton message. En revanche ce qui m'intéresse aussi dans ce tuto c'est que quelqu'un puisse le faire dans son langage habituel (une des raison pour laquelle je n'ai utilisé aucune lib externe). Dans les exemples que tu donne, je trouve que ça cache une partie des opérations intéressantes, toute la mécanique qui est derrière.

Bref, j'ai bien lu et entendu vos messages, je sais pas si c'est le titre qui est mauvais, l'approche générale à revoir ou mon intention qui est mal comprise… Je voyais ça plus comme une intro ludique au traitement (même si c'est vrai personne n'utilise ce format, personne ne réalise les opérations comme ça, etc, ). Du coup je suis un peu perdu.

Merci de vos remarques ;)

Ce sujet est verrouillé.