2013-09-22 63 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