יום ראשון, 8 בפברואר 2009

קוד פתוח נגד זיהום האוויר

לאון מינץ

הכל התחיל כשקראתי בלינמגזין על scipy ועל numpy ועל כך שהם יכולים להוות תחליף למטלאב. כעבור זמן מה למדתי על פייתון מתוך ויקיספר ומאז אני מגיש תרגילי בית בפייתון בלבד, לעיניהם המקנאות של משתמשי המטלאב...



כידוע, מצב זיהום האוויר במפרץ חיפה הוא בכי רע למרות מה שהרשויות מספרות. יתרה מזאת, ישנן טענות כי בלילות, מתי שהמפעלים פולטים את רוב המזהמים, תחנות הניטור מנוטרלות(!)...

החלטתי לשים את היד על הדופק ולעקוב באופן רציף אחר קריאות המנטרים. הייתי אופטימי כשציפיתי שאיגוד ערים חיפה יתן לי את זה ב-RSS. מה שקורה בפועל הוא שיש שני קבצי PNG במסווה של דפי PHP:
הרעיון הוא לקרוא את המספרים באמצעות OCR. ובכן, שלבי הפעולה הם:
  1. הורדת התמונות למחשב עם wget.
  2. לאחר מכן יש לבצע cropping עבור המלבנים המעניינים אותנו.
  3. לבסוף יש להמיר עם OCR. לצורך כך נשתמש ב-gocr.
אז הנה קוד הפייתון שעושה את כל זה:



import os # for executing wget, gocr
import Image
import ImageFilter as Filter
import ImageEnhance as Enhance

url1='http://www.net4u.co.il/envihaifa/map.php'

url2='http://www.net4u.co.il/envihaifa/Proopin.php'
command1='wget ' + url1 + ' -O map1.png'
command2='wget ' + url2 + ' -O map2.png'

print '===================='
print 'Retrieving map1...'
print '===================='
os.system(command1)
print '===================='

print 'Retrieving map2...'
print '===================='
os.system(command2)

rect={}

rect['Shuk_Talpiot']=[164,132,195,144]
rect['Kiryat_Shprintzak']=[47,102,76,114]
rect['Carmelia']=[62,208,92,220]
rect['Ahuza']=[122,225,153,238]

rect['Einstein']=[153,289,183,300]
rect['Neve_Shaanan']=[237,237,267,249]
rect['Krayot_tunnel']=[256,197,285,208]
rect['Nesher']=[318,307,348,318]
rect['Igud_Arim']=[348,236,377,247]
rect['Kfar_Hasidim']=[449,330,478,342]
rect['Kiryat_Tivon']=[509,429,539,441]
rect['Kiryat_Binyamin']=[480,231,510,244]
rect['Kiryat_Ata']=[499,209,528,221]

rect['Kiryat_Bialik']=[493,87,523,99]
rect['Kiryat_Motzkin']=[488,35,517,46]
rect['Kiryat_Haim']=[379,69,408,80]
rect['Kiryat_Yam']=[444,3,474,16]
rect['DATE']=[13,3,88,18]
rect['TIME']=[97,4,138,17]


rect2={}


rect2['Romema']=[78,21,107,32]
rect2['Israelia']=[182,91,212,103]
rect2['Sapir']=[89,111,119,122]

EXT='.png'
Air_quality={}

print 'Processing map1...'
# Load, convert to Grayscale and Invert colors:
im = Image.open('map1.png').convert('L').point(lambda i: 255 -i)

for obj in rect:
# Crop rectangle and Sharpen:
cropped=im.crop(rect[obj]).filter(Filter.SHARPEN)
if ((rect[obj] == rect['DATE']) or (rect[obj] == rect['TIME'])):
# Date and Time are on different background...
cropped=cropped.point(lambda i: 255 -i)

# Increase contrast:
cropped=Enhance.Contrast(cropped).enhance(2)
cropped.save(obj + EXT)
# Run OCR and store:
Air_quality[obj]=os.popen('gocr -i ' + obj + EXT).read()

print 'Processing map2...'

im = Image.open('map2.png').convert('L').point(lambda i: 255 -i)
for obj in rect2:
cropped=im.crop(rect2[obj]).filter(Filter.SHARPEN)
cropped=Enhance.Contrast(cropped).enhance(2)
cropped.save(obj + EXT)
Air_quality[obj]=os.popen('gocr -i ' + obj + EXT).read()


for obj in Air_quality:
print obj+': ', Air_quality[obj]


מה שנשאר לעשות זה לאחסן את המידע לאורך זמן בקובץ טקסט ולהציג את המידע על גרף עם pylab. אולי אפילו ליצור GNOME Panel Applet שיציג את הנתונים המעודכנים ישירות אל תוך שורת המשימות...

הכתבה פורסמה גם בלינמגזין

אין תגובות: