一、項目背景與目標

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

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

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

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

1. 圖像預處理

圖像預處理是OCR識別的關(guā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)

# 邊緣檢測
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)# 計算周長
approx = cv.approxPolyDP(cnt,0.1* peri,True) # 輪廓近似

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

在確定了文檔的邊緣后,我們需要根據(jù)邊緣的四點確定文檔的區(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)

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

3. 文字識別

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

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 ='預處理后的圖像路徑'# 注意替換為實際路徑
image = get_file_content(image_path)

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

res = client.basicGeneral(image, options)

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

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

四、項目效果展示

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

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

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

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

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

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

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

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

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

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

上一篇:

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

下一篇:

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

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費