一文教你使用EasyOCR從圖像中檢測(cè)文本:實(shí)踐指南
什么是 OCR?
OCR 的前身是光學(xué)字符識(shí)別,它對(duì)當(dāng)今的數(shù)字世界具有革命性意義。OCR 實(shí)際上是一個(gè)完整的過程,在此過程中,數(shù)字世界中存在的圖像/文檔被處理,文本被處理成普通的可編輯文本。
OCR的目的
OCR 是一種技術(shù),可讓你將不同類型的文檔(例如掃描的紙質(zhì)文檔、PDF 文件或數(shù)碼相機(jī)拍攝的圖像)轉(zhuǎn)換為可編輯和可搜索的數(shù)據(jù)。
EasyOCR 是什么?
EasyOCR 實(shí)際上是一個(gè) Python 包,它將 PyTorch 作為后端處理程序。EasyOCR 像任何其他 OCR(Google 的 tesseract 或任何其他)一樣檢測(cè)圖像中的文本,但我在使用它時(shí),我發(fā)現(xiàn)它是從圖像中檢測(cè)文本的最直接的方法,而且它將 PyTorch 作為后端處理程序,準(zhǔn)確性更可靠。EasyOCR 支持 42 多種語言進(jìn)行檢測(cè)。EasyOCR 是由 Jaided AI 公司創(chuàng)建的。
目錄
安裝核心依賴
導(dǎo)入庫
讀取圖像
通過網(wǎng)址
本地
從圖像中提取文本帶
GPU
不帶 GPU
英文文本
土耳其語文本和其他語言
在圖像上繪制結(jié)果
示例 1
示例 2
處理多行文本
1.安裝核心依賴
PyTorch將 PyTorch 作為完整包安裝可能有點(diǎn)棘手,因此我建議你瀏覽PyTorch的官方網(wǎng)站。當(dāng)你打開其官方網(wǎng)站時(shí),你將在其界面中看到下圖。
現(xiàn)在,如果你仔細(xì)查看上圖,你會(huì)發(fā)現(xiàn)有許多選項(xiàng)可供我們選擇,根據(jù)我們的選擇獲得最兼容的命令。讓我向你展示我想提及的內(nèi)容!
在上面的表示中,你可以注意到我選擇了Package: pip和Compute platform: CPU,根據(jù)我的選擇,我得到了命令 - pip install torchvision torchaudio。得到這個(gè)命令后,只需在你的命令提示符下運(yùn)行這個(gè)命令,你的 PyTorch 庫就會(huì)成功安裝。EasyOCR成功安裝PyTorch庫后,很容易安裝EasyOCR庫,你只需要運(yùn)行以下命令:pip3 install easyocr
然后你的命令提示符界面將如下所示:
2. 導(dǎo)入庫import os
import easyocr
import cv2
from matplotlib import pyplot as plt
import numpy as np
3. 讀取圖像**拍攝在線圖片:**這里我們將從URL 中獲取圖片(在線)IMAGE_PATH = 'https://blog.a(chǎn)spose.com/wp-content/uploads/sites/2/2020/05/Perform-OCR-using-C.jpg'
在上面的代碼片段中,可以注意到IMAGE_PATH包含圖像的URL。從本地獲取圖像:這里我們將從本地系統(tǒng)中獲取圖像。IMAGE_PATH = 'Perform-OCR.jpg'
在上面的代碼片段中,可以注意到我從本地獲取了圖像。4. 從圖像中提取文本英文文本檢測(cè)reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
輸出:[[[[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR']]
根據(jù)你的喜好添加圖像。
讓我們逐行分解代碼:在這里,我們使用EasyOCR類中的Reader類,然后將 ['en']作為屬性傳遞,這意味著現(xiàn)在它只會(huì)將圖像的英文部分檢測(cè)為文本,如果它找到其他語言,如中文和**日文,**則它會(huì)忽略那些文本,F(xiàn)在,在上面的行中,我們已經(jīng)設(shè)置了語言的屬性,這里我們?cè)趓eadText()函數(shù)中加載IMAGE_PATH并且會(huì)發(fā)現(xiàn)一個(gè)參數(shù)是**“段落”,這里它被設(shè)置為False**,這意味著現(xiàn)在easyOCR不會(huì)合并結(jié)果,即如果EasyOCR會(huì)遇到多個(gè)文本,它不會(huì)合并它們,而是將它們分開顯示。以二維 NumPy 數(shù)組的形式獲取結(jié)果**。**土耳其語文本檢測(cè)# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
# Same code here just changing the attribute from ['en'] to ['zh']
reader = easyocr.Reader(['tr'])
result = reader.readtext(IMAGE_PATH,paragraph="False")
result
輸出:[[[[89, 7], [717, 7], [717, 108], [89, 108]],
'Most Common Texting Slang in Turkish'],
[[[392, 234], [446, 234], [446, 260], [392, 260]], 'test'],
[[[353, 263], [488, 263], [488, 308], [353, 308]], 'yazmak'],
[[[394, 380], [446, 380], [446, 410], [394, 410]], 'link'],
[[[351, 409], [489, 409], [489, 453], [351, 453]], 'ba?lant?'],
[[[373, 525], [469, 525], [469, 595], [373, 595]], 'tag etiket'],
[[[353, 674], [483, 674], [483, 748], [353, 748]], 'follov takip et']]
根據(jù)喜好,我正在添加我已完成此土耳其語文本檢測(cè)的圖像!
EasyOCR 目前**支持 42 種語言,**我提供了所有這些語言及其符號(hào)的集合。玩得開心吧伙計(jì)們!南非荷蘭語 (af)、阿塞拜疆語 (az)、波斯尼亞語 (bs)、捷克語 (cs)、威爾士語 (cy)、丹麥語 (da)、德語 (de)、英語 (en)、西班牙語 (es)、愛沙尼亞語 (et)、法語 (fr)、愛爾蘭語 (ga)、克羅地亞語 (hr)、匈牙利語 (hu)、印度尼西亞語 (id)、冰島語 (is)、意大利語 (it)、日語 (ja)、韓語 (ko)、庫爾德語 (ku)、拉丁語 (la)、立陶宛語 (lt)、拉脫維亞語 (lv)、毛利語 (mi)、馬來語 (ms)、馬耳他語 (mt)、荷蘭語 (nl)、挪威語 (no)、波蘭語 (pl)、葡萄牙語 (pt)、羅馬尼亞語 (ro)、斯洛伐克語 (sk)、斯洛文尼亞語 (sl)、阿爾巴尼亞語 (sq)、瑞典語 (sv)、斯瓦希里語 (sw)、泰語 (th)、他加祿語 (tl)、土耳其語 (tr)、烏茲別克語 (uz)、越南語 (vi)、中文 (zh) –EasyOCR提供了足夠的靈活性來選擇使用或不使用 GPU 的文本檢測(cè)**。**使用 GPU 從圖像中提取文本# Changing the image path
IMAGE_PATH = 'Turkish_text.png'
reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[89, 7], [717, 7], [717, 75], [89, 75]],
'Most Common Texting Slang',
0.8411301022318493),
([[296, 60], [504, 60], [504, 108], [296, 108]],
'in Turkish',
0.9992136162168752),
([[392, 234], [446, 234], [446, 260], [392, 260]], 'text', 0.955612246445849),
([[353, 263], [488, 263], [488, 308], [353, 308]],
'yazmak',
0.8339281200424168),
([[394, 380], [446, 380], [446, 410], [394, 410]],
'link',
0.8571656346321106),
([[351, 409], [489, 409], [489, 453], [351, 453]],
'baglanti',
0.9827189297769966),
([[393, 525], [446, 525], [446, 562], [393, 562]], 'tag', 0.999996145772132),
([[373, 559], [469, 559], [469, 595], [373, 595]],
'etiket',
0.9999972515293261),
([[378, 674], [460, 674], [460, 704], [378, 704]],
'follow',
0.9879666041306504),
([[353, 703], [483, 703], [483, 748], [353, 748]],
'takip et',
0.9987622244733467)]
在沒有 GPU 的情況下從圖像中提取文本# Changing the image path
IMAGE_PATH = 'Perform-OCR.jpg'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[95, 71], [153, 71], [153, 107], [95, 107]], 'OCR', 0.990493426051807)]
# Where 0.9904.. is the confidence level of detection
注意:如果你沒有GPU并且沒有將其設(shè)置為**False,**那么你將收到以下警告:
5.1. 單行文本的繪制結(jié)果 – 示例 1top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
在上面的代碼片段中,我們正在嘗試獲取坐標(biāo)以在我們必須執(zhí)行檢測(cè)的圖像上繪制邊界框和文本。在top_left變量中,我們以元組訪問的形式從結(jié)果中獲取左上角的坐標(biāo)。同樣,我們可以獲取右下角的坐標(biāo)。從二維數(shù)組格式獲取文本的坐標(biāo)從 cv2 包中選擇文本字體為FONT_HERSHEY_SIMPLEX。img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,bottom_right, font, 0.5,(0,255,0),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
現(xiàn)在,我們已經(jīng)獲得了坐標(biāo),讓我們繪制它們!使用**cv2 imread()**函數(shù)讀取圖像使用top_left和bottom_right坐標(biāo)繪制矩形并給出下降顏色((0,255,0)) 和thickness(3)。使用top_left坐標(biāo)在圖像上繪制文本(矩形邊界框正上方)顯示圖像輸出:
5.2. 單行文本的繪制結(jié)果 – 示例 2IMAGE_PATH = 'sign.png'
reader = easyocr.Reader(['en'], gpu=False)
result = reader.readtext(IMAGE_PATH)
result
輸出:[([[19, 181], [165, 181], [165, 201], [19, 201]],
'HEAD PROTECTION',
0.9778256296390029),
([[31, 201], [153, 201], [153, 219], [31, 219]],
'MUST BE WORN',
0.9719649866726915),
([[39, 219], [145, 219], [145, 237], [39, 237]],
'ON THIS SITE',
0.9683973478739152)]
獲取坐標(biāo)top_left = tuple(result[0][0][0])
bottom_right = tuple(result[0][0][2])
text = result[0][1]
font = cv2.FONT_HERSHEY_SIMPLEX
繪制文本和邊界框img = cv2.imread(IMAGE_PATH)
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,top_left, font, 0.5,(0,0,255),2,cv2.LINE_AA)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
輸出:
堅(jiān)持住!如果我們想查看圖像本身中的所有文本檢測(cè)怎么辦?這就是我將在本節(jié)中做的事情!5.3. 處理多行文本的結(jié)果img = cv2.imread(IMAGE_PATH)
spacer = 100
for detection in result:
top_left = tuple(detection[0][0])
bottom_right = tuple(detection[0][2])
text = detection[1]
img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
img = cv2.putText(img,text,(20,spacer), font, 0.5,(0,255,0),2,cv2.LINE_AA)
spacer+=15
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.show()
在上面的代碼片段中,我們只需要關(guān)注以下幾點(diǎn):這里我們不是檢測(cè)單行文本,而是遍歷所有檢測(cè),因?yàn)槲覀兿胍L制多行文本在cv2.putText上給出坐標(biāo)時(shí),我們使用了一個(gè)額外的變量,它是**“間隔”,這個(gè)間隔在代碼后面會(huì)增加到+15**,這有助于限制文本相互碰撞。這個(gè)間隔變量將幫助文本保持排序和等距。輸出:
模型的結(jié)論也結(jié)束了今天的討論 。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
7月8日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
- 3 一文看懂視覺語言動(dòng)作模型(VLA)及其應(yīng)用
- 4 “支付+”時(shí)代,支付即生態(tài) | 2025中國跨境支付十大趨勢(shì)
- 5 中國最具實(shí)力AI公司TOP10
- 6 特斯拉Robotaxi上路,馬斯克端上畫了十年的餅
- 7 國家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 8 AI的夏天:第四范式VS云從科技VS地平線機(jī)器人
- 9 張勇等人退出阿里合伙人
- 10 深圳跑出40億超級(jí)隱形冠軍:賣機(jī)器人年入6.1億,港股上市