Histogramme du “niveau d’encre noire” d’une image par axe horizontal

J’ai un fichier image en noir et blanc (ou pdf) et je veux obtenir un histogramme du profil horizontal de l’image. C’est-à-dire que pour chaque colonne de l’image, je souhaite la sum des valeurs de niveaux de gris des pixels de la colonne. Si l’image est X par Y pixels, je me retrouverai avec des nombres X entre 0 (pour une colonne entièrement noire) et 255 * Y (pour une colonne entièrement blanche).

S’il vous plaît voir le deuxième panneau de cette bande dessinée Bande dessinée

Je voudrais un histogramme comme celui-ci, mais chaque casier représenterait toute l’encre noire de l’image à cette coordonnée x (pixel).

En tant qu’étudiant diplômé pauvre, je suis contraint d’utiliser uniquement la ligne de commande Linux, les programmes FOSS (ImageMagick, gnuplot, Perl, g ++, etc.). Quelque chose comme le GIMP ne serait utile que si je pouvais exécuter la commande via le terminal, car je n’aurais pas access à une interface graphique. Un fichier de sortie visuel serait utile pour plus tard, mais n’est pas nécessaire.

Est-ce que quelqu’un sait comment je peux extraire cette information? Les recherches de “profil d’image” mènent simplement à des informations sur les profils de couleur.

    Je donnerai une réponse en deux actes, en utilisant deux de mes utilitaires gratuits préférés: python et gnuplot.

    En tant qu’étudiant diplômé en informatique, mon conseil est que si vous voulez faire des choses gratuitement, python est l’un des outils les plus polyvalents que vous pouvez apprendre à utiliser.

    Voici un script python qui effectue la première partie, en comptant la valeur de gris (de 0 pour le blanc à 255 pour le noir):

     #!/usr/bin/python import Image # basic image processing/manipulation, just what we want im = Image.open('img.png') # open the image file as a python image object with open('data.dat', 'w') as f: # open the data file to be written for i in range(im.size[0]): # loop over columns counter = sum(im.getpixel((i,j)) for j in range(im.size[1])) f.write(str(i)+'\t'+str(counter)+'\n') # write to data file 

    Étonnamment indolore! Maintenant, pour que gnuplot fasse un histogramme *:

     #!/usr/bin/gnuplot set terminal pngcairo size 925,900 set output 'plot.png' #set terminal pdfcairo #set output 'plot.pdf' set multiplot ## first plot set origin 0,0.025 # this plot will be on the bottom set size 1,0.75 # and fill 3/4 of the whole canvas set title "Black count in XKCD 'Self-Description'" set xlabel 'Column' set ylabel "Black\ncount" norotate offset screen 0.0125 set lmargin at screen 0.15 # make plot area correct size set rmargin at screen 0.95 # width = 740 px = (0.95-0.15)*925 px set border 0 # these settings are just to make the data set grid # stand out and not overlap with the tics, etc. set tics nomirror set xtics scale 0.5 out set ytics scale 0 set xr [0:740] # x range such that there is one spike/pixel ## uncomment if gnuplot version >= 4.6.0 ## this will autoset the x and y ranges #stats 'data.dat' #set xr [STATS_min_x:STATS_max_x+1] #set yr [STATS_min_y:STATS_may_y] plot 'data.dat' with impulse notitle lc 'black' ## second plot set origin 0,0.75 # this plot will be on top set size 1,0.25 # and fill 1/4 of the canvas unset ylabel; unset xlabel # clean up a bit... unset border; unset grid; unset tics; unset title set size ratio -1 # ensures image proper ratio plot 'img.png' binary filetype=png with rgbimage unset multiplot # important to unset multiplot! 

    Pour exécuter ces scripts, enregistrez-les dans le même répertoire que l’image que vous voulez tracer (dans ce cas, la bande dessinée XKCD, que j’ai enregistrée sous le nom img.png ). Rendez-les exécutables. En bash c’est

     $ chmod 755 grayscalecount.py plot.plt 

    Alors (si python + image module + gnuplot sont tous installés), vous pouvez exécuter

     $ ./grayscalecount.py $ ./plot.plt 

    Sur mon ordinateur, exécutant Ubuntu 11.10 avec gnuplot 4.4.3, j’obtiens ce joli graphique à la fin:

    entrer la description de l'image ici

    ** Side note *: il y a beaucoup de différents histogrammes que gnuplot peut faire. J’ai pensé que ce style montrait bien les données, mais vous pouvez envisager de formater vos données pour les histogrammes gnuplot .

    Il existe de nombreuses façons de faire des tracés de python lui-même ou avec gnuplot (matplotlib, pygnuplot, gnuplot-py), mais je ne suis pas aussi facile avec ceux-ci. Gnuplot est incroyablement scriptable pour le traçage, et il existe de nombreuses manières de le faire jouer avec python, bash, C ++, etc.