python怎么处理文字_python 处理给规范的文字
你要處理的大多數文字都是比較干凈、格式規范的。格式規范的文字通常可以滿足一些需求,不過究竟什么是“格式混亂”,什么算“格式規范”,確實因人而異。 通常,格式規范的文字具有以下特點:
使用一個標準字體(不包含手寫體、草書,或者十分“花哨的”字體) ? 雖然被復印或拍照,字體還是很清晰,沒有多余的痕跡或污點
排列整齊,沒有歪歪斜斜的字
沒有超出圖片范圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
文字的一些格式問題在圖片預處理時可以進行解決。例如,可以把圖片轉換成灰度圖,調 整亮度和對比度,還可以根據需要進行裁剪和旋轉(詳情請關注圖像與信號處理),但是,這些做法在進行更具擴展性的 訓練時會遇到一些限制。
格式規范文字的理想示例
通過下面的命令運行 Tesseract,讀取文件并把結果寫到一個文本文件中: `tesseract test.jpg text
cat text.txt?即可顯示結果。
識別結果很準確,不過符號^和*分別被表示成了雙引號和單引號。大體上可以讓你很舒服地閱讀。
通過Python代碼實現
import pytesseract
from PIL import Image
image = Image.open('test.jpg')
text = pytesseract.image_to_string(image)
print text
運行結果:
This is some text, written in Arial, that will be read by
Tesseract. Here are some symbols: !@#$%"&*()
對圖片進行閾值過濾和降噪處理(了解即可)
很多時候我們在網上會看到這樣的圖片:
Tesseract 不能完整處理這個圖片,主要是因為圖片背景色是漸變的,最終結果是這樣:
隨著背景色從左到右不斷加深,文字變得越來越難以識別,Tesseract 識別出的 每一行的最后幾個字符都是錯的。
遇到這類問題,可以先用 Python 腳本對圖片進行清理。利用 Pillow 庫,我們可以創建一個 閾值過濾器來去掉漸變的背景色,只把文字留下來,從而讓圖片更加清晰,便于 Tesseract 讀取:
from PIL import Image
import subprocess
def cleanFile(filePath, newFilePath):
image = Image.open(filePath)
# 對圖片進行閾值過濾,然后保存
image = image.point(lambda x: 0 if x<143 else 255)
image.save(newFilePath)
# 調用系統的tesseract命令對圖片進行OCR識別
subprocess.call(["tesseract", newFilePath, "output"])
# 打開文件讀取結果
file = open("output.txt", 'r')
print(file.read())
file.close()
cleanFile("text2.jpg", "text2clean.png")
通過一個閾值對前面的“模糊”圖片進行過濾的結果
除了一些標點符號不太清晰或丟失了,大部分文字都被讀出來了。Tesseract 給出了最好的 結果:
從網站圖片中抓取文字
用 Tesseract 讀取硬盤里圖片上的文字,可能不怎么令人興奮,但當我們把它和網絡爬蟲組合使用時,就能成為一個強大的工具。
網站上的圖片可能并不是故意把文字做得很花哨 (就像餐館菜單的 JPG 圖片上的藝術字),但它們上面的文字對網絡爬蟲來說就是隱藏起來 了,舉個例子:
雖然亞馬遜的 robots.txt 文件允許抓取網站的產品頁面,但是圖書的預覽頁通常不讓網絡機 器人采集。
圖書的預覽頁是通過用戶觸發 Ajax 腳本進行加載的,預覽圖片隱藏在 div 節點 下面;其實,普通的訪問者會覺得它們看起來更像是一個 Flash 動畫,而不是一個圖片文 件。當然,即使我們能獲得圖片,要把它們讀成文字也沒那么簡單。
下面的程序就解決了這個問題:首先導航到托爾斯泰的《戰爭與和平》的大字號印刷版 1, 打開閱讀器,收集圖片的 URL 鏈接,然后下載圖片,識別圖片,最后打印每個圖片的文 字。因為這個程序很復雜,利用了前面幾章的多個程序片段,所以我增加了一些注釋以讓 每段代碼的目的更加清晰:
import time
from urllib.request import urlretrieve
import subprocess
from selenium import webdriver
#創建新的Selenium driver
driver = webdriver.PhantomJS()
# 用Selenium試試Firefox瀏覽器:
# driver = webdriver.Firefox()
driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
# 單擊圖書預覽按鈕 driver.find_element_by_id("sitbLogoImg").click() imageList = set()
# 等待頁面加載完成
time.sleep(5)
# 當向右箭頭可以點擊時,開始翻頁
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
driver.find_element_by_id("sitbReaderRightPageTurner").click()
time.sleep(2)
# 獲取已加載的新頁面(一次可以加載多個頁面,但是重復的頁面不能加載到集合中)
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()
# 用Tesseract處理我們收集的圖片URL鏈接
for image in sorted(imageList):
# 保存圖片
urlretrieve(image, "page.jpg")
p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
f = open("page.txt", "r")
p.wait() print(f.read())
和我們前面使用 Tesseract 讀取的效果一樣,這個程序也會完美地打印書中很多長長的段 落,第六頁的預覽如下所示:
6
"A word of friendly advice, mon
cher. Be off as soon as you can,
that's all I have to tell you. Happy
he who has ears to hear. Good-by,
my dear fellow. Oh, by the by!" he
shouted through the doorway after
Pierre, "is it true that the countess
has fallen into the clutches of the
holy fathers of the Society of je-
sus?"
Pierre did not answer and left Ros-
topchin's room more sullen and an-
gry than he had ever before shown
himself.
但是,當文字出現在彩色封面上時,結果就不那么完美了:
WEI' nrrd Peace
Len Nlkelayevldu Iolfluy
Readmg shmdd be ax
wlnvame asnossxble Wenfler
an mm m our cram: Llhvary
- Leo Tmsloy was a Russian rwovelwst
I and moval phflmopher med lur
A ms Ideas 01 nonviolenx reswslance m 5 We range 0, "and"
如果想把文字加工成普通人可以看懂的 效果,還需要花很多時間去處理。
下一節將介紹另一種方法來解決文字混亂的問題,尤其是當你愿意花一點兒時間訓練 Tesseract 的時候。
通過給 Tesseract 提供大量已知的文字與圖片映射集,經過訓練 Tesseract 就可以“學會”識別同一種字體,而且可以達到極高的精確率和準確率,甚至可以忽略圖 片中文字的背景色和相對位置等問題。
總結
以上是生活随笔為你收集整理的python怎么处理文字_python 处理给规范的文字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 查询wifi信息的类,A
- 下一篇: 充电电流用软件测试准吗,实验:1A与2.