2013-09-22 101 views
5

Tôi đã tự hỏi làm thế nào bạn sử dụng thư viện hình ảnh Python để phân tích một hình ảnh bitmap đơn giản (nói bitmap có một đường màu đen dày ở phía trên) để nói cho chương trình là phần trên cùng của hình ảnh. Có thể xuất một thông điệp khi tìm thấy đường màu đen.Làm thế nào để phân tích hình ảnh bitmap trong python, sử dụng PIL?

Bất kỳ mã mẫu nào cũng sẽ là trợ giúp tuyệt vời.

+0

Xin chào, tôi đã cập nhật câu trả lời của mình bằng một số mã mẫu. Chúc mừng! – pandita

Trả lời

8

Bạn có thể chuyển đổi hình ảnh thành rgb (đỏ, xanh dương, xanh lục). Ví dụ, có được một hình ảnh từ đây:

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 

này trả về kích thước trong số pixel: (680,646). Bạn có thể truy vấn màu của từng pixel riêng lẻ bằng rgb_im.getpixel((x,y)) trong đó x đi ngang và y đi theo chiều dọc, từ trên xuống dưới tôi tin.

Vì vậy, để kiểm tra xem dòng đầu tiên là tất cả màu đen (hoặc chủ yếu là màu đen), bạn có thể làm một cái gì đó như thế nà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% của các điểm ảnh trong hàng đầu tiên là màu đen.

Hãy rà soát tất cả các màu sắc xuất hiện trong hàng đầu tiên với set(first_row) mà mang lại cho tôi:

{(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)} 

Vì vậy, ngay cả khi có khoảng 8% không pixel đen, chúng ta có thể thấy rằng hầu hết trong số này là đơn sắc đẹp, tức là sắc thái của màu xám; giá trị rgb khá gần nhau cho mỗi màu.

Có một hướng dẫn tốt về PIL đây: http://effbot.org/imagingbook/

Một cái nhìn tổng quan cơ bản có thể được tìm thấy ở đây: http://infohost.nmt.edu/tcc/help/pubs/pil.pdf

Như một phần thưởng, và không biết cho dù đó là tốt hay không (hoặc cho dù đó bao gồm PIL), có bản nháp miễn phí về "Lập trình máy tính với Python" có sẵn tại đây: http://programmingcomputervision.com/

+0

Cảm ơn bạn rất nhiều, bạn đã giải thích rất rõ! – Unknowen