6

Python Imaging Library を使用して単純なビットマップ画像 (ビットマップの上部に太い黒い線があるとします) を分析して、画像の上部をプログラムに伝える方法を知りたいと思っていました。黒い線が見つかったときにメッセージを出力するかもしれません。

サンプルコードは非常に役立ちます。

4

1 に答える 1

10

画像を(赤、青、緑)のRGBに変換できます。たとえば、ここから写真を取得します。

https://github.com/panditarevolution/PIL_Play/blob/master/blackline.jpg

import PIL

# The conversion should work equally with a bitmap
img = PIL.Image.open("blackline.jpg")
rgb_im = img.convert('RGB')

rgb_im.size

これはサイズをピクセル数で返します: (680,646). rgb_im.getpixel((x,y))個々のピクセルの色を、上から下にx水平方向と垂直方向にクエリできます。y

したがって、最初の行がすべて黒 (またはほとんど黒) であるかどうかを確認するには、次のようにします。

# Get the first row rgb values
first_row = [rgb_im.getpixel((i,0)) for i in range(rgb_im.size[0])]
# Count how many pixels are black. Note that jpg is not the cleanest of all file formats. 
# Hence converting to and from jpg usually comes with some losses, i.e. changes in pixel values. 
first_row.count((0,0,0)) # --> 628
len(first_row) #--> 680

628/680 = 最初の行のピクセルの 92% が黒です。

最初の行で発生するすべての色を確認してみましょうset(first_row)

{(0, 0, 0),
 (0, 0, 2),
 (0, 1, 0),
 (1, 0, 0),
 (1, 1, 1),
 (2, 2, 0),
 (2, 2, 2),
 (4, 4, 2),
 (4, 4, 4),
 (5, 5, 3),
 (5, 7, 6),
 (6, 6, 4),
 (7, 7, 5),
 (14, 14, 12),
 (14, 14, 14),
 (35, 36, 31),
 (52, 53, 48),
 (53, 54, 46),
 (63, 64, 59),
 (64, 65, 60),
 (66, 67, 61),
 (68, 69, 61),
 (76, 77, 71),
 (79, 82, 65),
 (94, 96, 83),
 (96, 98, 87),
 (99, 101, 90),
 (101, 103, 92)}

したがって、約 8% の黒以外のピクセルがある場合でも、これらのほとんどがかなりモノクロ、つまりグレーの色合いであることがわかります。各色の RGB 値は互いにかなり近くなっています。

ここに PIL に関する優れたチュートリアルがあります: http://effbot.org/imagingbook/

基本的な概要はここにあります: http://infohost.nmt.edu/tcc/help/pubs/pil.pdf

おまけとして、それが良いかどうか (または PIL をカバーしているかどうか) を知らなくても、「Python を使用したコンピューター ビジョンのプログラミング」の無料のドラフトをここで入手できます: http://programmingcomputervision.com/

于 2013-09-22T12:12:12.780 に答える