02.25 簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取

最近很多人同學私聊,想要這篇文章中的源碼,特意重發一下,文中代碼可粘貼複製。

最近和同事聊天,聊到一個比較充滿使命感的心酸的話題——在網上給小朋友抄題。。。那麼問題來了,除了大家所知的QQ文字識別功能之外,還有哪些方式可以做到文字識別呢。

作為一名熱心的Python小工,我想這個問題可以嘗試著使用Python解決一下,看下效果。

Google一下,發現很多大的廠商(百度、阿里、騰訊等)已有相關的API開放使用,那麼我們今天就以百度為例,分享下如何使用百度文字識別(OCR)服務,實現文字提取,其實三者都嘗試過,感覺百度的效果最好(非評測),所以本文就以百度為例。

先簡單介紹下,百度大腦AI開發平臺,首先我們需要註冊下開發平臺用戶,非常簡單,手機號碼註冊即可。

http://ai.baidu.com/

登錄後我們可以在控制檯看到,開發平臺提供的眾多服務,其中有文字識別服務。


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取


創建一個文字識別服務應用,如下


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取


簡單操作後,我們就可以成功創建一個服務應用,如下,其中AppID、API Key、Secret Key是我們後面調用OCR服務時需要用到的。


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取


接下來,我們看下如何使用Python調用百度OCR服務實現文字提取。

Python實現

代碼設計

  • 圖片壓縮:由於OCR服務對圖片大小有限制,因此在使用時若圖片大小超過最大限制,要進行壓縮處理。
  • OCR調用:實現利用百度OCR服務提取單張圖片文字,返回文字內容。
  • 批量處理:實現N張圖片的文字提取,並且保存提取結果到文本文件中。

圖片壓縮

<code> def photo_compression(original_image , tmp_image_path):     """     圖片備份、壓縮     :param original_image: 原始圖片路徑     :param tmp_image_path: 臨時圖片路徑,備份路徑     :return:     """     from PIL import Image     img = Image.open(original_image)     width, height = img.size     # 該數值壓縮後的圖片大約 200k+     while (width * height > 4000000):           width = width // 2         height = height // 2     e_img = img.resize((width, height), Image.BILINEAR)     save_path = path.join(tmp_image_path,                           os.path.basename(original_image))     e_img.save(save_path)          return save_path/<code>

OCR服務調用

該函數中使用到在上一章節,提到的AppID、API Key、Secret Key信息。

在代碼中,我們使用了basicGeneral(通用文字識別),每天免費使用50000次,還有basicAccurate通用文字識別(高精度版),每天免費使用500次。基本滿足我們日常使用,若不夠,可以再使用其他文字識別服務。

<code> def ocr(original_image):     """     使用百度OCR進行文字識別,支持jpg/jpeg/png/bmp格式     :param original_image: 待識別圖片     :return:     """     from aip import AipOcr     filename = path.basename(original_image)      APP_ID = '16572971'     API_KEY = '97jmvxVbuce8B3AQtxUirQ00'     SECRECT_KEY = 'dWAdA12ByPnSKzMI0MAXyvUwfDh171Cn'      client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)     with open(original_image, 'rb') as picfile_read:         img = picfile_read.read()         print "正在識別圖片: {0} ……".format(filename)         try:             # 通用文字識別,50000次/天免費             result = client.basicGeneral(img)         except:             # 通用文字識別(高精度版),500次/天免費             result = client.basicAccurate(img)      return result /<code>

批量處理

通過傳入單張圖片或多張圖片,調用OCR服務實現批量圖片文字提取。

<code> def run_ocr( original_image, tmp_image_path,           result_file_path='identify_results.txt'):     """     主函數 批量執行圖片文本識別,結果存儲     :param original_image: 原始圖片     :param tmp_image_path: 臨時圖片     :param result_file_path: 識別文字存儲文件     :return:     """     # 判斷是否存在歷史識別結果,若存在則刪除     if path.exists(result_file_path):         os.remove(result_file_path)     # 判斷臨時圖片路徑是否存在,若不存在則創建     if not path.exists(tmp_image_path):         os.mkdir(tmp_image_path)     # 臨時文件路徑列表     tmp_file_path = []     for picfile in glob.glob(original_image):         tmp_file = photo_compression(picfile, tmp_image_path)         tmp_file_path.append(tmp_file)     # 遍歷所有文件,進行ocr識別 結果存儲     for picfile in tmp_file_path:         result = ocr(picfile)         lines = [text.get('words').encode('utf-8') + '\\n' for text in result.get('words_result')]          with open(result_file_path, 'a+') as fo:             fo.writelines("=" * 100 + '\\n')             fo.writelines("【識別圖片】: {0} \\n".format(path.basename(picfile) ))             fo.writelines("【文本內容】: \\n")             fo.writelines(lines)         os.remove(picfile)          if __name__ == "__main__":     tmp_image_path = r'D:\\learn\\tmp'     original_image = r"D:\\learn\\*.png"     run_ocr(original_image,tmp_image_path)             /<code>

效果如下

單張圖片


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取


識別結果

<code> 軟件測試開發技術棧V 文章視頻微頭條收藏 支持反編譯,阿里開源性能監控分析神器 Arthas 1.0萬閱讀·15評論·2019-06-17 22:30      /<code>


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取


識別結果

<code> Arthas(阿爾薩斯)是 Alibaba開源的Java診斷性能監控分析工具,它不需要做任何的參數配置,就可以直觀的獲取各種維庋的性能數據。通過閱讀官網的介紹,可以看到,當我們遇到以下類似問題而束手無策時, Arthas可以幫助我們解決 這個類從哪個jar包加載的?為什麼會報各種類相關的 EXception? ■我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了? ■遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎? 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現! ■是否有一個全局視角來查看系統的運行狀況? ■有什麼辦法可以監控到M的實時運行狀態? Arthas支持JDK6+,支持 Linux/Mac∧ Winodws,採用命令行交互模式,同時提供豐富的 Tab自動補全功能,進一步方便進行問題的定位和診斷/<code>


批量處理結果


簡單實用,準確高效,Python利用百度文字識別服務實現圖片文字提取



分享到:


相關文章: