一、項(xiàng)目背景與目標(biāo)

隨著數(shù)字化辦公的普及,紙質(zhì)文檔的處理需求日益增加。傳統(tǒng)的手動(dòng)輸入方式不僅耗時(shí)費(fèi)力,還容易出錯(cuò)。而OCR技術(shù)則能夠自動(dòng)從圖像中提取文字信息,極大地提高了工作效率。本項(xiàng)目旨在通過(guò)OpenCV進(jìn)行圖像處理,結(jié)合百度OCR API的文字識(shí)別能力,實(shí)現(xiàn)一個(gè)簡(jiǎn)單、實(shí)用且高效的文檔OCR識(shí)別系統(tǒng)。

二、技術(shù)選型與工具介紹

  1. 1. OpenCV:OpenCV是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù),提供了豐富的圖像處理與分析功能。在本項(xiàng)目中,我們將利用OpenCV進(jìn)行圖像的預(yù)處理,包括灰度轉(zhuǎn)換、邊緣檢測(cè)、輪廓提取以及透射變換等,以提取出文檔的有效區(qū)域。
  2. 2.?百度OCR API:百度OCR API是百度提供的一項(xiàng)高性能文字識(shí)別服務(wù),支持多種語(yǔ)言與字符集的識(shí)別。通過(guò)調(diào)用百度OCR API,我們可以輕松實(shí)現(xiàn)圖像中文字的自動(dòng)提取與轉(zhuǎn)換。

三、項(xiàng)目實(shí)現(xiàn)步驟

1. 圖像預(yù)處理

圖像預(yù)處理是OCR識(shí)別的關(guān)鍵步驟之一。為了獲得更好的識(shí)別效果,我們需要對(duì)原始圖像進(jìn)行一系列處理,以提取出文檔的有效區(qū)域。

import cv2 as cv
import numpy as np

# 讀取圖像
img = cv.imread('document.jpg', cv.IMREAD_COLOR)
org = img.copy()
ratio =0.4# 縮放比例
img = cv.resize(img, dsize=None, fx=ratio, fy=ratio)

# 灰度轉(zhuǎn)換
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 邊緣檢測(cè)
edged = cv.Canny(gray,75,200)

# 輪廓提取
cnts, hierarchy = cv.findContours(edged.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
cnt =sorted(cnts, key=cv.contourArea, reverse=True)[0]# 面積最大的輪廓
peri = cv.arcLength(cnt,True)# 計(jì)算周長(zhǎng)
approx = cv.approxPolyDP(cnt,0.1* peri,True) # 輪廓近似

2. 文檔區(qū)域確定與透射變換

在確定了文檔的邊緣后,我們需要根據(jù)邊緣的四點(diǎn)確定文檔的區(qū)域,并利用透射變換將文檔視角轉(zhuǎn)換為正視圖。

def order_points(pts):
rect = np.zeros((4,2), dtype="float32")
s = pts.sum(axis=1)
rect[0]= pts[np.argmin(s)]
rect[2]= pts[np.argmax(s)]
diff = np.diff(pts, n=1, axis=1)
rect[1]= pts[np.argmin(diff)]
rect[3]= pts[np.argmax(diff)]
return rect

deffour_point_transform(image, pts):
rect = order_points(pts)
len= np.zeros((4,1))
for i, p inenumerate(rect):
if i !=3:
x = rect[i:(i +2),0]
y = rect[i:(i +2),1]
else:
x =[rect[3,0], rect[0,0]]
y =[rect[3,1], rect[0,1]]
len[i]= np.sqrt(((x[0]- x[1])**2+(y[0]- y[1])**2))
maxWidth =int(max(len[0],len[2]))
maxHight =int(max(len[1],len[3]))
dst = np.array([[0,0],[maxWidth -1,0],[maxWidth -1, maxHight -1],[0, maxHight -1]], dtype="float32")
M = cv.getPerspectiveTransform(rect, dst)
warped = cv.warpPerspective(image, M,(maxWidth, maxHight))
return warped

warped = four_point_transform(org, approx.reshape(4,2)/ ratio)

(注:此時(shí)代碼執(zhí)行后,將得到一個(gè)透視變換后的圖像。由于文本限制,無(wú)法直接展示圖片,但讀者可以在本地運(yùn)行代碼并查看結(jié)果。)

3. 文字識(shí)別

在完成圖像預(yù)處理和文檔區(qū)域確定后,我們調(diào)用百度OCR API進(jìn)行文字識(shí)別。

from aip importAipOcr

# 初始化AipOcr
APP_ID ='你的AppID'
API_KEY ='你的API_Key'
SECRET_KEY ='你的Secret_Key'
client =AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 讀取圖像并轉(zhuǎn)換為字節(jié)流
defget_file_content(filepath):
withopen(filepath,'rb')as fp:
return fp.read()

image_path ='預(yù)處理后的圖像路徑'# 注意替換為實(shí)際路徑
image = get_file_content(image_path)

# 調(diào)用OCR API進(jìn)行文字識(shí)別
options ={}
options["language_type"]="CHN_ENG"# 中英文識(shí)別
options["detect_direction"]="true"# 檢測(cè)圖像方向
options["detect_language"]="true"# 檢測(cè)語(yǔ)言
options["probability"]="true"# 返回識(shí)別概率

res = client.basicGeneral(image, options)

# 打印識(shí)別結(jié)果
if'words_result'in res:
for item in res['words_result']:
print(f"識(shí)別出的文字: {item['words']}, 置信度: {item['confidence']}")
else:
print("未識(shí)別到文字")

(注:此時(shí)代碼執(zhí)行后,將打印出OCR識(shí)別的結(jié)果,包括識(shí)別出的文字和對(duì)應(yīng)的置信度。同樣地,由于文本限制,無(wú)法直接展示識(shí)別結(jié)果,但讀者可以在本地運(yùn)行代碼并查看輸出結(jié)果。)

四、項(xiàng)目效果展示

通過(guò)本項(xiàng)目的實(shí)現(xiàn),我們成功地將一張包含文字的文檔圖像轉(zhuǎn)換為可編輯的電子文本。以下是本項(xiàng)目的一些關(guān)鍵效果展示:

  1. 1. 原始圖像:一張包含文字的文檔圖像,可能包含背景、噪音等干擾因素。

(注:由于文本限制,無(wú)法直接展示原始圖像。讀者可以想象或自行準(zhǔn)備一張文檔圖像。)

  1. 1. 預(yù)處理后的圖像:經(jīng)過(guò)邊緣檢測(cè)、輪廓提取和透射變換后,文檔區(qū)域被成功提取并轉(zhuǎn)換為正視圖。此時(shí),圖像中的文字更加清晰、易于識(shí)別。

(注:同樣地,由于文本限制,無(wú)法直接展示預(yù)處理后的圖像。但讀者可以在本地運(yùn)行代碼并查看結(jié)果。)

  1. 1.?OCR識(shí)別結(jié)果:調(diào)用百度OCR API后,文檔中的文字被成功識(shí)別并轉(zhuǎn)換為電子文本。識(shí)別結(jié)果中包含了每個(gè)識(shí)別出的文字及其對(duì)應(yīng)的置信度。

(注:讀者可以在本地運(yùn)行代碼并查看識(shí)別結(jié)果。)

五、項(xiàng)目總結(jié)與優(yōu)化建議

通過(guò)本項(xiàng)目的實(shí)踐,我們掌握了利用OpenCV進(jìn)行圖像預(yù)處理、結(jié)合百度OCR API進(jìn)行文字識(shí)別的關(guān)鍵技術(shù)。同時(shí),我們也深刻體會(huì)到了OCR技術(shù)在數(shù)字化辦公

本文章轉(zhuǎn)載微信公眾號(hào)@諱疾忌醫(yī)-note

上一篇:

用 Poe-API-wrapper 連接 DALLE、ChatGPT,批量完成AI繪圖或文字創(chuàng)作

下一篇:

vue3 實(shí)現(xiàn)簡(jiǎn)單頁(yè)面登錄,fastapi + mysql 前后端分離,pinia登錄狀態(tài)持久化
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)