2013-09-22 51 views
5

我想知道如何使用Python Imaging Library来分析一个简单的位图图像(比如位图顶部有一条粗黑线),以告诉程序是图像的顶部。当找到黑线时可能会输出一条消息。如何分析python中的位图图像,使用PIL?

任何示例代码将是一个很大的帮助。

+0

嘿,那里,我用一些示例代码更新了我的答案。干杯! – pandita

回答

8

你可以将图片转换为rgb,它是(红色,蓝色,绿色)。举例来说,从这里得到一个画面:(680,646)

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 

这在像素数返回的大小。您可以使用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 

六百八十○分之六百二十八= 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/

+0

非常感谢,你解释得非常好! – Unknowen