使用Pytesseract進(jìn)行光學(xué)字符識別
概述
本文,我們將使用計算機(jī)視覺技術(shù)從圖像中提取文本。提取文本后,我們將在該文本上應(yīng)用 OpenCV 的一些基本功能來增強(qiáng)它并獲得更準(zhǔn)確的結(jié)果。這個項目將非常有用,因為它可以節(jié)省從圖像打字的時間和精力。
范圍
· 對于將從圖像中獲取文本的大型組織而言,此應(yīng)用程序可能會節(jié)省時間。
· 它可以打開“無紙化文檔”的世界,這也有助于升級存儲。
· 它還可以幫助自動化過程,因為它可以從圖像本身中獲取文本。
我們將導(dǎo)入requests庫以獲取 git 文件和圖像的 URL 。
#import requests to install tesseract
import requests
注意:現(xiàn)在要下載 tesseract 文件,只需轉(zhuǎn)到我將在函數(shù)中作為參數(shù)提供的鏈接,但我只是提供另一種下載 tesseract 文件的方法。
# Downloading tesseract-ocr file
r = requests.get("https://raw.githubusercontent.com/tesseract-ocr/tessdata/4.00/ind.traineddata", stream = True)
將數(shù)據(jù)寫入文件以避免路徑問題
with open("ind.traineddata", "wb") as file:
for block in r.iter_content(chunk_size = 1024):
if block:
file.write(block)
我們現(xiàn)在將下載Pytesseract 庫運(yùn)行所需的tesseract,并將文件保存在open() 函數(shù)的路徑中。
!pip install pytesseract
如果你想將其安裝在筆記本中,此命令將安裝 Pytesseract 模塊
Requirement already satisfied: pytesseract in c:programdataanaconda3libsite-packages (0.3.8)
Requirement already satisfied: Pillow in c:programdataanaconda3libsite-packages (from pytesseract) (8.0.1)
在這一步中,我們將安裝 OCR 所需的庫,我們還將導(dǎo)入 IPython 函數(shù)以清除不需要的函數(shù)。
安裝光學(xué)字符識別所需的庫
! apt install tesseract-ocr libtesseract-dev libmagickwand-dev
導(dǎo)入 IPython 以清除不重要的輸出
from IPython.display import HTML, clear_output
clear_output()
現(xiàn)在,我們將安裝Pytesseract 和 OpenCV庫,它們是我們文本識別的靈魂
安裝Pytesseract 和 OpenCV!
pip install pytesseract wand opencv-python
clear_output()
導(dǎo)入所需的庫
# Import libraries
from PIL import Image
import pytesseract
import cv2
import numpy as np
from pytesseract import Output
import re
在這一步中,我們將打開一個圖像調(diào)整其大小,然后再次保存以供進(jìn)一步使用和可視化。
從URL讀取圖像
image = Image.open(requests.get('https://i.stack.imgur.com/pbIdS.png', stream=True).raw)
image = image.resize((300,150))
image.save('sample.png')
image
輸出:
設(shè)置tesseract的路徑
pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'
注意:上面的命令將在系統(tǒng)配置中設(shè)置tesseract庫的路徑,如果路徑?jīng)]有根據(jù)系統(tǒng)配置設(shè)置,那么即使安裝了tesseract也會拋出錯誤。
在這里,我們將使用自定義配置從圖像中提取文本。
# Simply extracting text from image
custom_config = r'-l eng --oem 3 --psm 6'
text = pytesseract.image_to_string(image,config=custom_config)
print(text)
輸出:
在自定義配置中,你可以看到**“eng”表示英語,即它會識別英文字母,你還可以添加多種語言,“PSM”表示頁面分割**,它設(shè)置了塊如何識別字符,“OEM”是默認(rèn)配置。
現(xiàn)在,我們將通過用空字符串替換符號,從提取的文本中刪除不需要的符號
# Extracting text from image and removing irrelevant symbols from characters
try:
text=pytesseract.image_to_string(image,lang="eng")
characters_to_remove = "!()@—*“>+-/,'|?#%$&^_~"
new_string = text
for character in characters_to_remove:
new_string = new_string.replace(character, "")
print(new_string)
except IOError as e:
輸出:
在下面的單元格中,我們將圖像讀入OpenCV格式以進(jìn)一步處理。當(dāng)我們需要從復(fù)雜圖像中提取文本時,這是必需的。
現(xiàn)在我們將執(zhí)行OpenCV操作以從復(fù)雜圖像中獲取文本。
image = cv2.imread('sample.png') # will read in the array format
輸出:
將圖像轉(zhuǎn)換為灰度圖像,使其處理起來不那么復(fù)雜,因為它只有 0 和 1 兩個值。這里我們使用cv2.cvtColor()方法將彩色圖像轉(zhuǎn)換為灰度格式,而cv2.cvtColor 實(shí)際上可以幫助圖像的 150 色轉(zhuǎn)換。
灰度圖像
def get_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = get_grayscale(image)
Image.fromarray(gray)
輸出:
現(xiàn)在我們將模糊圖像,以便我們可以從圖像中去除噪聲。在這里,我們使用函數(shù)cv2.medianBlur() 函數(shù)以減少圖像中的噪聲**,**模糊基本上是通過應(yīng)用相關(guān)平滑濾波器來平滑圖像的技術(shù),是圖像處理中廣泛使用的方法之一。
降噪
def remove_noise(image):
return cv2.medianBlur(image,5)
noise = remove_noise(gray)
Image.fromarray(gray)
輸出:
我們將在這里進(jìn)行閾值變換。閾值適用于簡單的概念,即當(dāng)像素值低于給定的閾值時,顏色為白色,否則像素顏色正好相反,即黑色。使用的函數(shù)是cv2.threshold。
閾值
def thresholding(image):
# source image, grayscale image
return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY +
cv2.THRESH_OTSU)[1]
thresh = thresholding(gray)
Image.fromarray(thresh)
輸出:
這里我們正在做腐蝕變換。腐蝕變換是圖像變換中最基本、最重要的步驟之一。腐蝕變換通常會擬合圖像中缺失的形狀和格子,這有助于在圖像中稍微模糊或扭曲時識別字符。在這里,我們使用cv2 庫中的erode()函數(shù)進(jìn)行腐蝕轉(zhuǎn)換。
腐蝕
def erode(image):
kernel = np.ones((5,5),np.uint8)
return cv2.erode(image, kernel, iterations = 1)
erode = erode(gray)
Image.fromarray(erode)
輸出:
在這里,我們將執(zhí)行形態(tài)變換。形態(tài)變換是最適合二值圖像的技術(shù)之一,它根據(jù)圖像的像素值對圖像進(jìn)行排序,而不是在考慮閾值的情況下對圖像的數(shù)值進(jìn)行排序。
形態(tài)變換
def opening(image):
kernel = np.ones((5,5),np.uint8)
return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
opening = opening(gray)
Image.fromarray(opening)
輸出:
在這里,我們試圖匹配圖像。當(dāng)我們傳遞相同的圖像進(jìn)行匹配時,我們得到了99.99%的相似度。這里,模板匹配是一種在較大的圖像中搜索和查找模板圖像的位置的方法。對于模板匹配,我們使用cv2 庫中的 match template()函數(shù)。
模板匹配
def match_template(image, template):
return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
match = match_template(gray, gray)
match
輸出:
array([[1.]], dtype=float32)
現(xiàn)在我們將通過在文本周圍創(chuàng)建一個矩形來分隔文本中的每個字符。
# Drawing rectangle around text
img = cv2.imread('sample.png')
h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img)
for b in boxes.splitlines():
b = b.split(' ')
img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)
Image.fromarray(img)
輸出:
最后,我們可以圍繞特定的圖案或單詞繪制矩形。
# Drawing pattern on specific pattern or word
img = cv2.imread('sample.png')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys())
date_pattern = 'artificially'
n_boxes = len(d['text'])
for i in range(n_boxes):
if float(d['conf'][i]) > 60:
if re.match(date_pattern, d['text'][i]):
(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
Image.fromarray(img)
輸出:
結(jié)論
我們從學(xué)習(xí)如何安裝用于文本提取的 tesseract 開始。接下來,我們拍攝了一張圖像并從該圖像中提取了文本。我們了解到我們需要使用 OpenCV 的某些圖像轉(zhuǎn)換函數(shù)來從復(fù)雜圖像中提取文本。
尾注
希望你們會喜歡這個使用 Pytesseract逐步學(xué)習(xí)光學(xué)字符識別的方法。
原文標(biāo)題 : 使用Pytesseract進(jìn)行光學(xué)字符識別
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市