我有一个黑白图像(或PDF)文件,并希望得到图像的水平configuration文件的直方图。 也就是说,对于图像中的每一列,我想要列中像素的灰度值的总和。 如果图像是X乘以Y像素,则我将以0(全黑列)和255 * Y(全白列)之间的X数字结束。
请看这个漫画的第二个面板
我想要一个像这样的直方图,但是每个bin都将表示图像中所有x坐标(像素)处的“黑色墨水”。
作为一个穷人的研究生,我只受限于使用Linux命令行,FOSS程序(ImageMagick,gnuplot,Perl,g ++等)。 像GIMP这样的东西只有在我可以通过terminal运行命令时才有用,因为我不能访问GUI。 一个可视化的输出文件将在以后帮助,但没有必要。
有谁知道我可以提取这些信息的方式吗? search“图像configuration文件”只是导致颜色configuration文件的信息。
我会用两个我最喜欢的免费工具python和gnuplot来给出一个答案。
作为研究生(计算机)的研究生,我的建议是,如果你想做的事情免费python是最通用的工具之一,你可以学习使用。
这是一个python脚本,它执行第一部分,计算灰度值(从0代表白到255代表黑):
#!/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
令人震惊的无痛! 现在有gnuplot做一个直方图*:
#!/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!
要运行这些脚本,将它们保存在想要绘制的图像的相同目录中(在这种情况下是XKCD漫画,我保存为img.png
)。 使他们可执行。 在bash中是这样的
$ chmod 755 grayscalecount.py plot.plt
然后(如果python +图像模块+ gnuplot都安装),你可以运行
$ ./grayscalecount.py $ ./plot.plt
在我的电脑上,用gnuplot 4.4.3运行Ubuntu 11.10,最后得到了这个很酷的情节:
**附注*:gnuplot可以制作很多不同的直方图。 我认为这种风格显示的数据很好,但你可以看看格式化你的数据gnuplot直方图 。
有很多方法可以让python自己或者使用gnuplot(matplotlib,pygnuplot,gnuplot-py)来制作图表,但是我不那么容易。 Gnuplot是非常好的绘图脚本,有很多方法可以很好的与python,bash,C ++等进行合作。