9

白黒の画像 (または pdf) ファイルがあり、画像の水平プロファイルのヒストグラムを取得したいと考えています。つまり、画像の列ごとに、列内のピクセルのグレースケール値の合計が必要です。画像が X x Y ピクセルの場合、0 (完全に黒い列の場合) から 255*Y (完全に白い列の場合) までの X の数値になります。

この漫画の2コマ目を見てください 漫画

このようなヒストグラムが欲しいのですが、各ビンはその x 座標 (ピクセル) で画像内のすべての「黒インク」を表します。

貧しい大学院生として、私は Linux コマンド ライン、FOSS プログラム (ImageMagick、gnuplot、Perl、g++ など) しか使用できないという制約があります。GIMP のようなものは、GUI にアクセスできないため、ターミナル経由でコマンドを実行できる場合にのみ役立ちます。ビジュアル出力ファイルは後で役立ちますが、必須ではありません。

この情報を抽出する方法を知っている人はいますか? 「イメージ プロファイル」で検索すると、カラー プロファイルに関する情報が表示されます。

4

1 に答える 1

13

私のお気に入りの 2 つの無料ユーティリティである python と gnuplot を使用して、2 回に分けて回答します。

仲間の (計算) 大学院生としての私のアドバイスは、無料で何かをしたい場合、python は使用方法を学べる最も用途の広いツールの 1 つであるということです。

グレースケール値 (白の 0 から黒の 255 まで) をカウントする最初の部分を実行する python スクリプトを次に示します。

#!/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。それらを実行可能にします。バッシュでは、これは

$ chmod 755 grayscalecount.py plot.plt

次に (python+image モジュール+gnuplot がすべてインストールされている場合)、実行できます。

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

gnuplot 4.4.3 で Ubuntu 11.10 を実行している私のコンピューターでは、最後に次のクールなプロットが表示されます。

ここに画像の説明を入力

**補足*: gnuplot で作成できるさまざまなヒストグラム プロットがたくさんあります。このスタイルはデータをよく表していると思いましたが、gnuplot histogramsのデータのフォーマットを調べることができます。

Python でプロット自体を作成する方法や、gnuplot (matplotlib、pygnuplot、gnuplot-py) を使用する方法は多数ありますが、私はそれらを簡単に使用することはできません。Gnuplot はプロット用に驚くほどスクリプト化可能であり、Python、bash、C++ などでうまく動作させる方法がたくさんあります。

于 2012-10-31T01:25:00.933 に答える