公司有個需求,簡單點說需要從一張圖片中識別出中文,通過python來實現,當然其他程序也行,只要能實現,而小編主要學習python,所以就提了python。一個小白在網上遨游了一天,終於找到一絲絲思緒,特意在此分享,希望大神提出寶貴的意見。
今天還是在學習OCR算法中,但是好像自己摸索確實比較難一點,而且python實現圖片中文識別的方法還是不多,所以我打算記錄一下自己學習的過程。今天看到一個菜鳥都可以用的開源項目,那就是OCR開源項目tesseract,可能對於還是菜鳥的我來說,最好不過了,可以試試此項目,還可以看看源碼,何樂而不為呢!
OCR開源項目很多,給大家一個鏈接,這個鏈接列出了現有的比較出名的OCR開源項目,鏈接如下:
https://en.wikipedia.org/wiki/Comparison_of_optical_character_recognition_software
從上面的排名可以看到,Tesseract是排在第一名的!所以下面就認真學習一下Tesseract。首先介紹一下Tesseract,然后安裝,測試,了解其不足等等。
Tesseract的OCR引擎目前已作為開源項目發布在Google Project, 其項目主頁在這里查看https://github.com/tesseract-ocr, 它支持中文OCR,並提供了一個命令行工具。python中對應的包是 pytesseract. 通過這個工具我們可以識別圖片上的文字。
一 Tesseract的安裝測試使用
1.1 小編的開發環境如下:
- windows 7
- python 3.6
- pycharm
1.2 下載安裝包
首先下載Tesseract在Windows下的安裝版。(因為在國外訪問不了谷歌,所以別人翻牆下載了下來,這里給大家百度網盤鏈接)
http://pan.baidu.com/s/1i56Uxlr
根據https://github.com/tesseract-ocr/tesseract/wiki,找到非官方的安裝包,好像只看到64位的安裝包 http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe,下載后直接安裝即可,但是要記得你的安裝目錄,我們等會配置環境變量要用。
如果不是做英文的圖文識別,還需要下載其他語言的識別包https://github.com/tesseract-ocr/tesseract/wiki/Data-Files。
簡體字識別包:https://raw.githubusercontent.com/tesseract-ocr/tessdata/4.00/chi_sim.traineddata
繁體字識別包:https://github.com/tesseract-ocr/tessdata/raw/4.0/chi_tra.traineddata
安裝python對應的包:pytesseract
pip install pytesseract
1.3 安裝Tesseract
下載Tesseract-OCR引擎,注意要3.0以上才支持中文哦,按照提示安裝就行。(此處附上windows 4.0的安裝過程)
既然是要訓練中文,記得勾選 additional language data
找到中文簡體和中文繁體,按需勾選,然后點下一步
可以先不勾選,因為這樣直接下載語言的包實在太慢。可以從網頁上直接下載語言包,然后等程序安裝好后,放入安裝目錄下tessdata目錄下面
下載下來之后一路Next安裝好,然后在開始菜單找到其控制台引導程序,如下圖所示:
使用Tesseract ocr有兩種方式: 動態庫方式 libtesseract和執行程序方式 tesseract.exe 小編使用的是第二個方式,也方便Python調用(主要是小編比較菜)。
1.4 測試英文字符識別
上面的安裝包里自帶了已經訓練好的英文-拉丁文識別數據~所以我們先來測試一下英文字符的識別吧~識別圖像如下:
1.4.1 把上面的圖片放到Tesseract的安裝目錄下,如下圖所示:
1.4.2 打開上面提到的控制台窗口,如下圖所示:
1.4.3 在窗口中輸入命令:“tesseract.exe 0.jpg 1”,並回車,如下圖所示:
01.jpg代表待識別的源文件,1代表輸出文件名,默認輸出格式是txt文件格式! 注意,上面的 lang之前是-l 而不是-1!
1.4.4 讓我們先查看一下01.jpg照片,如下圖:
1.4.5 在安裝目錄下生成了1.txt文件,識別結果如下圖所示:
既然安裝好了,測試也可以了,我們就進行實戰,做圖像識別。
二 python用tesseract-ocr做圖像識別
雖然說一行代碼可以搞定識別圖片,但是我們需要導入兩個庫,這是別人寫好的封裝好的庫文件。只有導入人家庫,我們才能識別一行代碼實現圖片文字。
- 這里我們需要用到兩個庫:pytesseract和PIL
- 同時我們還需要安裝識別引擎tesseract-ocr
2.1 pytesseract和PIL的安裝
安裝這兩個包可以借助pip
- 1,命令行安裝 pip install PIL pip install pytesseract - 2,如果你用的pycharm編輯器,就可以直接借助pycharm實現快速安裝。
2.2 大概介紹下相關模塊的概念:
Python-tesseract 是光學字符識別Tesseract OCR引擎的Python封裝類。能夠讀取任何常規的圖片文件(JPG, GIF ,PNG , TIFF等)並解碼成可讀的語言。在OCR處理期間不會創建任何臨文件
PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,目前版本為 1.1.7,我們可以 在這里 下載學習和查找資料。
Image 類是 PIL 庫中一個非常重要的類,通過這個類來創建實例可以有直接載入圖像文件,讀取處理過的圖像和通過抓取的方法得到的圖像這三種方法。
python對圖像的處理比較常見的是用pytesseract識別驗證碼,要安裝pytesseract庫,必須先安裝其依賴的PIL及tesseract-ocr,其中PIL為圖像處理庫,而后面的tesseract-ocr則為google的ocr識別引擎。
下載鏈接:http://www.waitalone.cn/python-php-ocr.html 該鏈接文檔描述了如何配置相關環境,以及識別驗證碼的python代碼, 總結起來就三步: 安裝PIL.exe; 安裝tesseract-ocr-setup.exe; 安裝pip install pytesseract
2.3 解決python2.X中PIL在Python3.X中不能使用
目前PIL的官方最新版本為1.1.7,支持的版本為python 2.5, 2.6, 2.7,並不支持python3,經查詢python3.X用pillow代替,進入DOS命令行窗口,敲入以下代碼
pip install pillow
提示安裝成功,再運行程序沒有問題。
2.4 正式識別圖片中的文字(包括簡單的英文和復雜的英文)
2.4.1 下面進入正題,我們識別下面的東西,看圖(三種情況):
2.4.2 python代碼如下:
import pytesseract from PIL import Image #打開驗證碼圖片 image = Image.open('02.jpg') #加載一下圖片防止報錯,此處可以省略 image.load() #調用show來展示圖片,調試用此處可以省略 image.show() text = pytesseract.image_to_string(Image.open('02.jpg')) print(text)
2.4.3 查看運行結果,運行后,結果如下:
2.4.5 總結
從上面我們可以發現,運行代碼后的結果, 清晰的印刷體字體比較清晰,基本沒有問題。簡單的圖片識別率還是可以的,但是復雜的話 就...,所以希望自己繼續學習,繼續尋找有用的庫。
三 Image模塊的用法介紹(轉)
3.1 簡介
圖像處理是一門應用非常廣的技術,而擁有非常豐富第三方擴展庫的 Python 當然不會錯過這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,目前版本為 1.1.7,我們可以 在這里 下載學習和查找資料。
Image 類是 PIL 庫中一個非常重要的類,通過這個類來創建實例可以有直接載入圖像文件,讀取處理過的圖像和通過抓取的方法得到的圖像這三種方法。
3.2 使用
導入 Image 模塊。然后通過 Image 類中的 open 方法即可載入一個圖像文件。如果載入文件失敗,則會引起一個 IOError ;若無返回錯誤,則 open 函數返回一個 Image 對象。現在,我們可以通過一些對象屬性來檢查文件內容,即:
1 >>> import Image 2 >>> im = Image.open("j.jpg") 3 >>> print im.format, im.size, im.mode 4 JPEG (440, 330) RGB
這里有三個屬性,我們逐一了解。
format : 識別圖像的源格式,如果該文件不是從文件中讀取的,則被置為 None 值。
size : 返回的一個元組,有兩個元素,其值為象素意義上的寬和高。
mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。
3.3 簡單的幾何變化
色彩空間變換。
convert() : 該函數可以用來將圖像轉換為不同色彩模式。
圖像增強。
Filters : 在 ImageFilter 模塊中可以使用 filter 函數來使用模塊中 一系列預定義的增強濾鏡。
>>>out = im.resize((128, 128)) >>>out = im.rotate(45) #逆時針旋轉 45 度角。 >>>out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右對換。 >>>out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下對換。 >>>out = im.transpose(Image.ROTATE_90) #旋轉 90 度角。 >>>out = im.transpose(Image.ROTATE_180) #旋轉 180 度角。 >>>out = im.transpose(Image.ROTATE_270) #旋轉 270 度角。