OVH Cloud OVH Cloud

PIL grayscale -> binary

11 réponses
Avatar
R12y
Bonjour,
J'ai des images qui ont été scannées et qui sont en "niveaux de gris".
A l'impression, c'est un peu fade.
Je souhaiterai draconniennement les transformer en noir et blanc, c'est à
dire vraiment soit noir soit blanc.
Je n'ai pas trouvé comment le faire avec PIL
Vous auriez des pistes?
Il y a une centaines de fichiers à transformer, je ne veux pas le faire
manuellement avec un quelconque logiciel de retoucehs d'images, et pas
avec imagemagic. Je veux le faire en Python.
J'ai cherché sur le site qui distribue PIL, pas de lien vers une
quelconque ML.
--
My Debian/apt repo:
My Fedora/yum Repo:
http://www.locataire-serveur.info/sections/liens/fedora-core-yum

10 réponses

1 2
Avatar
jean-michel bain-cornu
Bonjour,
R12y wrote:
Bonjour,
J'ai des images qui ont été scannées et qui sont en "niveaux de gris".
A l'impression, c'est un peu fade.
Je souhaiterai draconniennement les transformer en noir et blanc, c'est à
dire vraiment soit noir soit blanc.
Je n'ai pas trouvé comment le faire avec PIL
Vous auriez des pistes?
Il y a une centaines de fichiers à transformer, je ne veux pas le faire
manuellement avec un quelconque logiciel de retoucehs d'images, et pas
avec imagemagic. Je veux le faire en Python.
J'ai cherché sur le site qui distribue PIL, pas de lien vers une
quelconque ML.
Dans wx il y a des méthodes de la classe wxImage qui peuvent peut-être

t'aider.
Par exemple : wxImage::ConvertToMono (extrait de la doc: Returns
monochromatic version of the image. The returned image has white colour
where the original has (r,g,b) colour and black colour everywhere
else.). En supposant que tes niveaux de gris soient bien quand même un
codage RVB (ce devrait être le cas).
Il y a aussi des méthodes pour tripoter individuellement chaque pixel
(exemple SetRGB). Evidemment ça n'ira pas si tu veux traiter 50 images
de 5mo à la seconde.
Tu peux aussi le scripter avec Gimp, mais c'est HS d'après ta question.
Au fait, quel est ton format d'image ?
A+
jm

Avatar
R12y
jean-michel bain-cornu :
Au fait, quel est ton format d'image ?


Ce sont des jpeg.
Je vais regarder si wx est packagé pour Fedora.
Merci.

--
My Debian/apt repo:
My Fedora/yum Repo:
http://www.locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
Frédéric Momméja
R12y écrivait le 14/02/06 15:31 :
jean-michel bain-cornu :
Au fait, quel est ton format d'image ?


Ce sont des jpeg.
Je vais regarder si wx est packagé pour Fedora.


Tu as également PythonMagick qui te permet de piloter ImageMagik, ici :
http://starship.python.net/crew/zack/pymagick/

Je ne l'ai pas essayé.

--
Frédéric Momméja


Avatar
R12y
Frédéric Momméja :
Tu as également PythonMagick qui te permet de piloter ImageMagik, ici :
http://starship.python.net/crew/zack/pymagick/


Pas mal! Je vais tester ce soir. Comment on appelle la fonction qui
converti de grayscale vers noir et blanc uniquement sous ImageMagick?
(je ne vois pas quel groupe est adapté...)
Avec wx, c'est "Mono".

Ou bien, on va augmenter le contraste à outrance?

--
My Debian/apt repo:
My Fedora/yum Repo:
http://www.locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
Encolpe Degoute
R12y écrivait le 14/02/06 15:31 :

jean-michel bain-cornu :

Au fait, quel est ton format d'image ?



Ce sont des jpeg.
Je vais regarder si wx est packagé pour Fedora.



Tu as également PythonMagick qui te permet de piloter ImageMagik, ici :
http://starship.python.net/crew/zack/pymagick/

Je ne l'ai pas essayé.


Moi non plus, mais vu la date de dernière modification je vais attendre
que R12y le fasse ;)

<!-- Changed by: Zack Roadhouse, 20-Nov-1997 -->

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales



Avatar
jean-michel bain-cornu
jean-michel bain-cornu wrote:
R12y wrote:
Dans wx il y a des méthodes de la classe wxImage qui peuvent peut-être
t'aider.
Par exemple : wxImage::ConvertToMono (extrait de la doc: Returns
J'ai fait quelques essais. La méthode marche bien, mais elle convertit

simplement *une* couleur en blanc et le reste en noir. Il ne s'agit pas
d'une extraction des teintes comme on trouve dans gimp.
Tu devras donc boucler pour toutes les couleurs si tu veux t'en servir
comme convertisseur, plus re-boucle pour fusionner les images ainsi
produites : plutôt raide comme solution !
GetData paraît plus prometteuse car elle rend une array avec les valeurs
RVB de l'image. Une petite bouboucle pour modifier les pixels, et il ne
reste plus qu'à faire un SetData. ça me semble beaucoup mieux qu'avec
ConvertToMono.
Comme ton image est déjà en gris, les valeurs R, V et B devraient être
identiques pour un pixel donné (sinon, c'est pas gris !); il faut juste
déterminer le seuil qui décidera si le pix doit être blanc ou noir, genre :
if pix[0]<127:
pix[0]=pix[1]=pix[2]=0
else:
pix[0]=pix[1]=pix[2]%5
Note que tout ça c'est théorique...
A+
jm

Avatar
Frédéric Momméja
Encolpe Degoute écrivait le 14/02/06 16:49 :
Tu as également PythonMagick qui te permet de piloter ImageMagik, ici :
http://starship.python.net/crew/zack/pymagick/

Je ne l'ai pas essayé.


Moi non plus, mais vu la date de dernière modification je vais attendre
que R12y le fasse ;)

<!-- Changed by: Zack Roadhouse, 20-Nov-1997 -->


Bien vu !

Mais il y a des chances pour que ce ne soit qu'une interface pour
dialoguer avec ImageMagick en utilisant les commandes habituelles d'IM.
Dans ce cas même si les commandes changent ou évoluent, ça devrait
toujours fonctionner. ;)

D'ailleurs c'est toujours référencé comme *la* bonne interface avec
Python sur le site d'IM.
http://www.imagemagick.org/script/api.php#python

--
Frédéric Momméja


Avatar
Frédéric Momméja
R12y écrivait le 14/02/06 16:33 :
Frédéric Momméja :
Tu as également PythonMagick qui te permet de piloter ImageMagik, ici :
http://starship.python.net/crew/zack/pymagick/


Pas mal! Je vais tester ce soir. Comment on appelle la fonction qui
converti de grayscale vers noir et blanc uniquement sous ImageMagick?
(je ne vois pas quel groupe est adapté...)
Avec wx, c'est "Mono".

Ou bien, on va augmenter le contraste à outrance?


À la fin de cette page :
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/color/#greyscale

cherche "-monochrome".

--
Frédéric Momméja


Avatar
jean-michel bain-cornu
jean-michel bain-cornu wrote:
jean-michel bain-cornu wrote:

R12y wrote:
Dans wx il y a des méthodes de la classe wxImage qui peuvent peut-être
t'aider.
Par exemple : wxImage::ConvertToMono (extrait de la doc: Returns


J'ai fait quelques essais. La méthode marche bien, mais elle convertit
simplement *une* couleur en blanc et le reste en noir. Il ne s'agit pas
d'une extraction des teintes comme on trouve dans gimp.
Tu devras donc boucler pour toutes les couleurs si tu veux t'en servir
comme convertisseur, plus re-boucle pour fusionner les images ainsi
produites : plutôt raide comme solution !
GetData paraît plus prometteuse car elle rend une array avec les valeurs
RVB de l'image. Une petite bouboucle pour modifier les pixels, et il ne
reste plus qu'à faire un SetData. ça me semble beaucoup mieux qu'avec
ConvertToMono.
Comme ton image est déjà en gris, les valeurs R, V et B devraient être
identiques pour un pixel donné (sinon, c'est pas gris !); il faut juste
déterminer le seuil qui décidera si le pix doit être blanc ou noir, genre :
if pix[0]<127:
pix[0]=pix[1]=pix[2]=0
else:
pix[0]=pix[1]=pix[2]%5
Note que tout ça c'est théorique...
A+
jm
J'ai fait un essai.

ça marche avec :
data1= img.GetData()
data2= ''
white= chr(255)*3
black= chr(0)*3
for pixind in range(0,len(data1),3):
if ord(data1[pixind]) < 128:
data2Úta2+black
else:
data2Úta2+white
img.SetData(data2)
C'est très bien sauf que ça prend 20 secondes pour une image de 80 k
A suivre...


Avatar
jean-michel bain-cornu
C'est très bien sauf que ça prend 20 secondes pour une image de 80 k
A suivre...
Je me réponds à moi-même ! cool, je ne risque pas d'être traité...

En fait, l'image de 80k fait 1600*1200, soit quasiment 2mo. Tout
s'explique. IL faudrait plutôt trouver un moyen avec le replace,
spécialistes wanted ! Ou alors agir directement au niveau du jpeg.
Il faudrait aussi regarder dans la doc de gtk, après tout c'est avec ça
qu'ils ont fait gimp.
A+
jm
PS: en ce qui me concerne, ce ne sera pas pour ce soir, ma promise
m'appelle à festoyer...

1 2