【课件整理复习】第十一章 图像识别与文字处理
本章目標
- OCR庫概述
- 處理格式規(guī)范的文字
- 讀取驗證碼與訓練Tesseract
- 獲取驗證碼提交答案
一、OCR庫概述
概述
- 從 Google 的無人駕駛汽車到可以識別假鈔的自動售賣機,機器視覺一直都是一個應(yīng)用廣泛且具有深遠的影響和雄偉的愿景的領(lǐng)域。 在這一章里,重點介紹機器視覺的一個分支:文字識別,介紹如何用一些 Python 庫來識別和使用在線圖片中的文字。
場景
- 1.當你不想讓自己的文字被網(wǎng)絡(luò)機器人采集時, 把文字做成圖片放在網(wǎng)頁上是常用的辦法。在一些聯(lián)系人通訊錄里經(jīng)常可以看到,一個郵箱地址被部分或全部轉(zhuǎn)換成圖片。人們可能覺察不出明顯的差異, 但是機器人閱讀這些圖片會非常困難,這種方法可以防止多數(shù)垃圾郵件發(fā)送器輕易地獲取你的郵箱地址。
- 2.利用這種人類用戶可以正常讀取但是大多數(shù)機器人都沒法讀取的圖片, 驗證碼(CAPTCHA)就出現(xiàn)了。驗證碼讀取的難易程度也大不相同,有些驗證碼比其他的更加難讀,后面我們會介紹這種問題。
- 3.目前, 有很多文檔都是簡單地掃描后直接放到網(wǎng)上, 它們和互聯(lián)網(wǎng)上的很多文檔一樣都沒法兒直接使用, 盡管它們都“近在眼前”。如果無法將圖像轉(zhuǎn)為文字,要想使用這些文檔的內(nèi)容,就只能人工手敲了——沒人愿意花時間干這事兒。
方案
將圖像翻譯成文字一般被稱為光學文字識別( Optical Character Recognition, OCR)。可以實現(xiàn) OCR 的底層庫并不多,目前很多庫都是使用共同的幾個底層 OCR 庫,或者是在上面進行定制。
在讀取和處理圖像、圖像相關(guān)的機器學習以及創(chuàng)建圖像等任務(wù)中, Python 一直都是非常出色的語言。雖然有很多庫可以進行圖像處理,但在這里我們只重點介紹兩個庫: Pillow 和Tesseract。
每個庫都可以從它們的網(wǎng)站上下載并安裝( http://pillow.readthedocs.org/installation.html 和https://pypi.python.org/pypi/pytesseract), 或者用第三方管理器( 像 pip) 通過“ pillow”和“ pytesseract”進行安裝。
Pillow
- 盡管 Pillow 算不上是圖像處理功能最全的庫,但是它擁有你需要使用的全部功能,除非你要用 Python 重寫一個 Photoshop 或進行更加復(fù)雜的研究。它也是一個文檔健全且十分易用的庫。 http://pillow.readthedocs.org/
- Pillow 是從 Python 2.x 版本的 Python 圖像庫( Python Imaging Library, PIL)分出來的,支持 Python 3.x 版本。和 PIL 一樣, Pillow 也可以輕松地導入代碼,并通過大量的過濾、修飾甚至像素級的變換操作處理圖片。
如果在vscode開發(fā)工具中,open和save的文件路徑會以vscode 的項目文件夾作為根目錄,如 F:\gitee\python-scraping
描述
filter() 函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
該接收兩個參數(shù),第一個為函數(shù),第二個為序列,序列的每個元素作為參數(shù)傳遞給函數(shù)進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。
注意: Python2.7 返回列表,Python3.x 返回迭代器對象,具體內(nèi)容可以查看:Python3 filter() 函數(shù)
語法
以下是 filter() 方法的語法:
filter(function, iterable)
參數(shù)
function – 判斷函數(shù)。
iterable – 可迭代對象。
返回值
返回列表。
filter(function,iterable)
function判斷函數(shù),iterable可迭代對象,返回值,返回列表‘
Tesseract
Tesseract 是目前公認最優(yōu)秀、最精確的開源 OCR 系統(tǒng)。
除了極高的精確度, Tesseract 也具有很高的靈活性。它可以通過訓練識別出任何字體(只要這些字體的風格保持不變就可以),也可以識別出任何 Unicode 字符。
Tesseract 是一個 Python 的命令行工具,不是通過 import語句導入的庫。安裝之后,要用 tesseract 命令在 Python 的外面運行。
安裝
https://digi.bib.uni-mannheim.de/tesseract/
https://github.com/tesseract-ocr/tesseract/tags
設(shè)置
點擊系統(tǒng)變量新建增加一個TESSDATA_PREFIX變量名,變量值還是安裝路徑F:\Program Files (x86)\Tesseract-OCR\tessdata,全部確定,重新打開開發(fā)工具,運行代碼。
PATH中加入F:\Program Files (x86)\Tesseract-OCR
https://www.cnblogs.com/gl1573/p/9876397.html
如果在vscode開發(fā)工具中,open和save的文件路徑會以vscode 的項目文件夾作為根目錄,如 F:\gitee\python-scraping
NumPy
雖然 NumPy 并非解決 OCR 問題時必須使用的庫,但是如果你想訓練 Tesseract 識別本章后面提到的字符或字體, 那么就會用到它。 NumPy 是一個非常強大的庫,具有大量線性代數(shù)以及大規(guī)模科學計算的方法。 因為 NumPy 可以用數(shù)學方法把圖片表示成巨大的像素數(shù)組,所以它可以流暢地配合 Tesseract 完成任務(wù)。
和其他 Python 庫一樣, NumPy 可以通過第三方包管理器(比如 pip)來安裝:
二、處理格式規(guī)范的文字
概述
要處理的大多數(shù)文字都是比較干凈、格式規(guī)范的。格式規(guī)范的文字通常可以滿足一些需求,不過究竟什么是“格式混亂”,什么算“格式規(guī)范”,確實因人而異。
通常,格式規(guī)范的文字具有以下特點:
? 使用一個標準字體(不包含手寫體、草書,或者十分“花哨的”字體)
? 雖然被復(fù)印或拍照,字體還是很清晰,沒有多余的痕跡或污點
? 排列整齊,沒有歪歪斜斜的字
? 沒有超出圖片范圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
文字的一些格式問題在圖片預(yù)處理時可以進行解決。 例如,可以把圖片轉(zhuǎn)換成灰度圖,調(diào)整亮度和對比度, 還可以根據(jù)需要進行裁剪和旋轉(zhuǎn)。但是,這些做法在進行更具擴展性的訓練時會遇到一些限制。
清晰圖片識別
簡介
輸入如下命令進行識別:
KaTeX parse error: Expected 'EOF', got '#' at position 203: …ome symbols: !@#?%"&’()
模糊圖片識別
隨著背景色從左到右不斷加深,文字變得越來越難以識別。另外,經(jīng)過 JPG 格式轉(zhuǎn)換和模糊效果處理, Tesseract 更難識別小寫“ i”和大寫“ I”以及數(shù)字“ 1”。
遇到這類問題, 可以先用 Python 腳本對圖片進行清理。利用 Pillow 庫, 我們可以創(chuàng)建一個閾值過濾器來去掉漸變的背景色, 只把文字留下來,從而讓圖片更加清晰,便于 Tesseract讀取。
實現(xiàn)
from PIL import Image import subprocess def cleanFile(filePath, newFilePath):image = Image.open(filePath)#Set a threshold value for the image, and saveimage = image.point(lambda x: 0 if x<143 else 255)image.save(newFilePath)#call tesseract to do OCR on the newly created imagesubprocess.call(["tesseract", newFilePath, "output"]) #Open and read the resulting data fileoutputFile = open("output.txt", 'r')print(outputFile.read())outputFile.close()cleanFile("f:/gitee/python-scraping/v1/chapter11/files/text_2.png", "f:/gitee/python-scraping/v1/chapter11/files/text_2_clean.png")從網(wǎng)站圖片中抓取文字
雖然亞馬遜的 robots.txt 文件允許抓取網(wǎng)站的產(chǎn)品頁面,但是圖書的預(yù)覽頁通常不讓網(wǎng)絡(luò)機器人采集。圖書的預(yù)覽頁是通過用戶觸發(fā) Ajax 腳本進行加載的,預(yù)覽圖片隱藏在 div 節(jié)點下面;其實,普通的訪問者會覺得它們看起來更像是一個 Flash 動畫, 而不是一個圖片文件。當然,即使我們能獲得圖片,要把它們讀成文字也沒那么簡單。
import time from urllib.request import urlretrieve import subprocess from selenium import webdriver # driver = webdriver.PhantomJS() driver = webdriver.Chrome() driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200") time.sleep(2)driver.find_element_by_id("img-canvas").click() #The easiest way to get exactly one of every page imageList = set()#Wait for the page to load time.sleep(10) print(driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"))首先導航到托爾斯泰的《戰(zhàn)爭與和平》的大字號印刷版 1,打開閱讀器, 收集圖片的 URL 鏈接,然后下載圖片,識別圖片,最后打印每個圖片的文字。因為這個程序很復(fù)雜, 利用了前面幾章的多個程序片段,所以我增加了一些注釋以讓每段代碼的目的更加清晰:
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):#While we can click on the right arrow, move through the pagesdriver.find_element_by_id("sitbReaderRightPageTurner").click()time.sleep(2)#Get any new pages that have loaded (multiple pages can load at once)pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img")for page in pages:image = page.get_attribute("src")imageList.add(image) driver.quit() #Start processing the images we've collected URLs for with Tesseract for image in sorted(imageList):urlretrieve(image, "page.jpg")p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)p.wait()f = open("page.txt", "r")print(f.read())三、讀取驗證碼與訓練Tesseract
簡介
- 解決文字混亂的問題, 尤其是花一點兒時間訓練Tesseract 的時候。通過給 Tesseract 提供大量已知的文字與圖片映射集,經(jīng)過訓練 Tesseract就可以“學會”識別同一種字體,而且可以達到極高的精確率和準確率,甚至可以忽略圖片中文字的背景色和相對位置等問題。
CAPTCHA,全自動區(qū)分計算機和人類的圖靈測試( Completely Automated Public Turing test to tell Computers andHumans Apart)。它的奇怪縮寫似乎表示,它一直在扮演著十分奇怪的角色。其目的是為了阻止網(wǎng)站訪問, 而不是讓訪問更通暢。
圖靈測試首次出現(xiàn)在阿蘭·圖靈( Alan Turing) 1950 年發(fā)表的論文“計算裝置與智能”( Computing Machinery and Intelligence)中。他在論文中描述了這樣一種場景:一個人可以和其他人交流, 也可以通過計算機終端和人工智能程序交流。如果一番對話之后這個人不能區(qū)分人和人工智能程序, 那么就認為這個人工智能程序通過了圖靈測試,圖靈認為這個人工智能程序就可以真正地“思考”所有的事情。
簡單的驗證碼圖片特點
? 字母沒有相互疊加在一起, 在水平方向上也沒有彼此交叉。也就是說,可以在每一個字母外面畫一個方框,而不會重疊在一起。
? 圖片沒有背景色、線條或其他對 OCR 程序產(chǎn)生干擾的噪點。
? 雖然不能因一個圖片下定論, 但是這個驗證碼用的字體種類很少, 而且用的是 sans-serif字體(像“ 4”和“ M”)和一種手寫形式的字體(像“ m”“ C”和“ 3”)。
? 白色背景色與深色字母之間的對比度很高。
驗證碼圖片特點
? 字母和數(shù)據(jù)都使用了,這會增加待搜索字符的數(shù)量。
? 字母隨機的傾斜程度會迷惑 OCR 軟件,但是人類還是很容易識別的。
? 那個比較陌生的手寫字體很有挑戰(zhàn)性, 在“ C” 和“ 3”里面還有額外的線條。另外這個非常小的小寫“ m”,計算機需要進行額外的訓練才能識別。
訓練Tesseract
- 要訓練 Tesseract 識別一種文字,無論是晦澀難懂的字體還是驗證碼,你都需要向 Tesseract提供每個字符不同形式的樣本。
- 首先要把大量的驗證碼樣本下載到一個文件夾里。下載的樣本數(shù)量由驗證碼的復(fù)雜程度決定; 我在訓練集里一共放了 100 個樣本(一共 500 個字符,平均每個字符 8個樣本; a~z 大小寫字母加 0~9 數(shù)字,一共 62 個字符),應(yīng)該足夠訓練的了。
- 第二步是準確地告訴 Tesseract 一張圖片中的每個字符是什么,以及每個字符的具體位置。這里需要創(chuàng)建一些矩形定位文件( box file),一個驗證碼圖片生成一個矩形定位文件。
- 提示:建議使用驗證碼的真實結(jié)果給每個樣本文件命名(即 4MmC3.jpg)。 這樣可以幫你一次性對大量的文件進行快速檢查——你可以先把圖片調(diào)成縮略圖模式,然后通過文件名對比不同的圖片。這樣在后面的步驟中進行訓練效果的檢查也會很方便。
一個圖片的矩形定位文件
4 15 26 33 55 0 M 38 13 67 45 0 m 79 15 101 26 0 C 111 33 136 60 0 3 147 17 176 45 0- 第一列符號是圖片中的每個字符,后面的 4 個數(shù)字分別是包圍這個字符的最小矩形的坐標(圖片左下角是原點 (0,0), 4 個數(shù)字分別對應(yīng)每個字符的左下角 x 坐標、左下角 y 坐標、右上角 x 坐標和右上角 y 坐標),最后一個數(shù)字“ 0”表示圖片樣本的編號。
- 手工創(chuàng)建這些圖片矩形定位文件很無聊,可以利用一些工具完成。
- 矩形定位文件必須保存在一個 .box 后綴的文本文件中。和圖片文件一樣,文本文件也是用驗證碼的實際結(jié)果命名( 例如, 4MmC3.box)。
- Tesseract OCR Chopper( http://pp19dd.com/tesseract-ocr-chopper/),另外,這樣便于檢查 .box 文件的內(nèi)容和文件的名稱,而且按文件名對目錄中的文件排序之后,就可以讓 .box 文件與對應(yīng)的圖片文件的實際結(jié)果進行對比。
訓練
- 完成所有的數(shù)據(jù)分析工作和創(chuàng)建 Tesseract 所需的訓練文件,參見一個 Python 版的解決方案( https://github.com/REMitchell/tesseract-trainer)來處理同時包含圖片文件和 .box 文件的數(shù)據(jù)文件夾,然后自動創(chuàng)建所有必需的訓練文件。
四、獲取驗證碼提交答案
簡介
許多流行的內(nèi)容管理系統(tǒng)即使加了驗證碼模塊,其眾所周知的注冊頁面也經(jīng)常會遭到網(wǎng)絡(luò)機器人的垃圾注冊。
大多數(shù)網(wǎng)站生成的驗證碼圖片都具有以下屬性。
? 它們是服務(wù)器端的程序動態(tài)生成的圖片。 驗證碼圖片的 src 屬性可能和普通圖片不太一樣,比如 ,但是可以和其他圖片一樣進行下載和處理。
? 圖片的答案存儲在服務(wù)器端的數(shù)據(jù)庫里。
? 很多驗證碼都有時間限制, 如果太長時間沒解決就會失效。雖然這對網(wǎng)絡(luò)機器人來說不是什么問題, 但是如果保留驗證碼的答案一會兒再使用,或者想通過一些方法延長驗證碼的有效時限,可能很難成功。
總結(jié)
以上是生活随笔為你收集整理的【课件整理复习】第十一章 图像识别与文字处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux运维之认识与分析日志文件(rs
- 下一篇: 音乐给人们带来了什么