上次 g0v 黑客松,有 NGO 帶著去監察院申請出來的幾名政治人物的政治獻金的掃描檔,想問問看 g0v 能怎麼做
一共有 94 個檔案,將近 2800 頁,包含馬英九、顏清標、吳育昇、丁守中等人的政治獻金的各種收入、支出登記資料

拿到的第一件事,當然是先把 PDF 轉成圖檔傳到雲端啦~ 於是我寫了一隻程式去把 94 個 PDF 檔一頁一頁換成圖片上傳到相簿中,並且產生一個 list.csv 來記錄每個檔案的位置

完成了第一步之後,再來就是要做影像分析了,因為我要找的是表格中的框線,這時可以用到的是 Hough Transform (霍夫轉換),這是霍夫在 1967 年提出,用來做直線檢測的技術,而 opencv 則有提供現成的 HoughLinesP function 可以抓出一張圖片內所有線段
於是我用 C 寫了一個程式,給他一張圖片位置,他會給我這張圖片內所有線段位置的資訊的 json
於是透過 opencv 處理後,原先的圖如下:
政治獻金原圖

opencv 抓出來的線段位置
opencv 抓出的線段位置

其實已經可以看出 opencv 抓的很準了
不過opencv 抓到的一條框線中其實可能是數十條小線段聚在一起,所以我必需要把這些線段 group 在一起
於是接下來我用 PHP 寫了一個程式,其中的 addLine method 在做的事就是把輸入的線段 (x1, y1) - (x2, y2) ,透過公式 r = x * cos θ + y * sin θ 算出他的 θ 和 r ,然後把 θ 和 r 接近的 group 在一起,這樣子就可以抓出正確的框線了 (小時候學的三角函數在這時候竟然變得很重要 XD),得到了各線段之後,再用 getCrossPoints method 取得各垂直和水平線段之間的交點,這些交點資訊就是每一個欄位的四個座標點了,於是我再把這些資訊匯出到一個 output.csv 檔案(還在持續更新中..目前正用 Amazon t1.micro 機器慢慢處理中),大家就可以拿這個檔案來利用了

我也拿了這個結果做了一個陽春的 demo ,可以點進去看每一份文件的表格欄位切的如何,畫面如下:

demo

也歡迎有人接力把這個處理好的資料做成 captcha 之類的服務,讓群眾可以幫忙來把這份監察院不願意數位化開放的檔案來民間數位化吧!

榮尼王 發表在 痞客邦 PIXNET 留言(41) 人氣()