戰(zhàn):Pytesseract安裝配置與圖像預(yù)處理全攻略)
1. 項(xiàng)目概述為什么選擇Pytesseract進(jìn)行OCR識(shí)別在Python的生態(tài)里處理圖像中的文字識(shí)別OCR需求時(shí)pytesseract是一個(gè)繞不開的名字。它本質(zhì)上是Google開源的Tesseract-OCR引擎的一個(gè)Python封裝。我最初接觸它是因?yàn)橐粋€(gè)自動(dòng)化處理大量掃描版PDF合同的項(xiàng)目需要從中提取關(guān)鍵條款信息。市面上OCR服務(wù)很多但要么有調(diào)用次數(shù)限制要么費(fèi)用不菲。對(duì)于一個(gè)需要本地化、高并發(fā)、低成本處理的場(chǎng)景一個(gè)免費(fèi)、開源、可離線運(yùn)行的方案就成了剛需pytesseract恰好完美契合。簡(jiǎn)單來(lái)說(shuō)pytesseract讓你能在Python腳本里用幾行代碼調(diào)用強(qiáng)大的Tesseract引擎把圖片里的文字“讀”出來(lái)轉(zhuǎn)換成字符串。這對(duì)于文檔數(shù)字化、數(shù)據(jù)錄入自動(dòng)化、驗(yàn)證碼識(shí)別僅限學(xué)習(xí)研究請(qǐng)遵守相關(guān)法律法規(guī)和網(wǎng)站規(guī)定、車牌識(shí)別等場(chǎng)景非常有用。它的優(yōu)勢(shì)在于完全免費(fèi)、可定制性強(qiáng)并且隨著Tesseract 4.0引入LSTM神經(jīng)網(wǎng)絡(luò)對(duì)印刷體文字的識(shí)別準(zhǔn)確率已經(jīng)相當(dāng)可觀。當(dāng)然它也不是萬(wàn)能的。對(duì)于手寫體、極端扭曲的藝術(shù)字體、低分辨率或背景復(fù)雜的圖片識(shí)別率會(huì)大打折扣。但這并不妨礙它成為我們工具箱里的一件利器。這篇文章我就結(jié)合自己多次部署和使用的經(jīng)驗(yàn)從零開始帶你搞定pytesseract的安裝、配置并深入到實(shí)際使用中的各種技巧和避坑指南。無(wú)論你是想快速實(shí)現(xiàn)一個(gè)OCR小工具還是需要在復(fù)雜項(xiàng)目中集成文字識(shí)別功能相信這些內(nèi)容都能給你提供直接的幫助。2. 核心組件拆解與環(huán)境準(zhǔn)備在開始敲代碼之前我們必須理解pytesseract工作的兩個(gè)核心依賴Python包本身和底層的Tesseract-OCR引擎。pytesseract只是一個(gè)“翻譯官”或“調(diào)用器”真正的“識(shí)別大腦”是Tesseract。因此安裝分為兩步且順序不能錯(cuò)先安裝引擎再安裝Python接口。2.1 Tesseract-OCR引擎的安裝這是最關(guān)鍵也最容易出問(wèn)題的一步。pytesseract會(huì)去尋找系統(tǒng)環(huán)境中的tesseract命令。如果找不到后續(xù)一切都會(huì)報(bào)錯(cuò)。Windows系統(tǒng)安裝下載安裝包前往Tesseract在GitHub的官方發(fā)布頁(yè)。我強(qiáng)烈建議不要從一些第三方下載站獲取以免版本過(guò)舊或捆綁垃圾軟件。直接搜索“tesseract github releases”找到最新穩(wěn)定版。選擇版本你會(huì)看到以exe結(jié)尾的安裝程序例如tesseract-ocr-w64-setup-5.3.1.20230401.exe。注意版本號(hào)5.x版本已經(jīng)集成了最新的LSTM引擎。安裝過(guò)程運(yùn)行安裝程序基本上一路“Next”即可。但有一個(gè)至關(guān)重要的步驟在安裝過(guò)程中會(huì)有一個(gè)界面讓你選擇“Additional script data”和“Additional language data”。這里務(wù)必勾選你需要的語(yǔ)言包默認(rèn)只安裝英文eng。如果你需要識(shí)別中文必須勾選“Chinese (Simplified)”和“Chinese (Traditional)”。即使暫時(shí)不用也建議把中文包裝上以備不時(shí)之需。把它們安裝到默認(rèn)路徑。配置環(huán)境變量安裝完成后需要將Tesseract的安裝目錄例如C:\Program Files\Tesseract-OCR添加到系統(tǒng)的PATH環(huán)境變量中。右鍵點(diǎn)擊“此電腦” - “屬性” - “高級(jí)系統(tǒng)設(shè)置” - “環(huán)境變量”。在“系統(tǒng)變量”中找到Path點(diǎn)擊“編輯”。點(diǎn)擊“新建”將Tesseract的安裝目錄路徑添加進(jìn)去。驗(yàn)證打開命令提示符cmd或PowerShell輸入tesseract --version并回車。如果正確顯示版本信息如tesseract 5.3.1則說(shuō)明安裝和配置成功。注意很多新手卡在這一步就是因?yàn)榘惭b后沒有添加環(huán)境變量或者添加后沒有重啟終端。添加環(huán)境變量后你需要關(guān)閉所有已打開的終端窗口再重新打開一個(gè)新的進(jìn)行測(cè)試。macOS系統(tǒng)安裝使用Homebrew是最簡(jiǎn)單的方式。打開終端執(zhí)行以下命令brew install tesseract安裝后可以通過(guò)tesseract --version驗(yàn)證。如果需要安裝語(yǔ)言包例如中文可以使用brew install tesseract-langLinux系統(tǒng)安裝以Ubuntu/Debian為例使用apt包管理器sudo apt update sudo apt install tesseract-ocr # 安裝英文語(yǔ)言包 sudo apt install tesseract-ocr-eng # 安裝簡(jiǎn)體中文語(yǔ)言包 sudo apt install tesseract-ocr-chi-sim # 安裝繁體中文語(yǔ)言包 sudo apt install tesseract-ocr-chi-tra同樣使用tesseract --version驗(yàn)證。2.2 Python環(huán)境與pytesseract包安裝確保你的Python環(huán)境已經(jīng)就緒建議使用Python 3.7及以上版本。然后通過(guò)pip安裝pytesseract包這個(gè)過(guò)程非常簡(jiǎn)單pip install pytesseract同時(shí)因?yàn)槲覀円幚韴D片所以通常還會(huì)用到圖像處理庫(kù)Pillow(PIL的一個(gè)友好分支)pip install Pillow至此所有環(huán)境依賴就準(zhǔn)備完畢了。你可以通過(guò)一個(gè)快速的Python交互來(lái)測(cè)試基礎(chǔ)環(huán)境是否通順import pytesseract print(pytesseract.get_tesseract_version())如果這行代碼能成功打印出Tesseract的版本號(hào)恭喜你最難的坎已經(jīng)過(guò)去了。3. 基礎(chǔ)使用與核心參數(shù)解析環(huán)境搞定我們立刻上手看看如何用最簡(jiǎn)單的代碼實(shí)現(xiàn)圖片文字識(shí)別。這里我準(zhǔn)備了一張包含“Hello, World! 你好世界”的測(cè)試圖片test.png。3.1 最簡(jiǎn)識(shí)別流程from PIL import Image import pytesseract # 1. 使用Pillow打開圖片 image Image.open(test.png) # 2. 調(diào)用image_to_string函數(shù)進(jìn)行識(shí)別 text pytesseract.image_to_string(image) # 3. 打印結(jié)果 print(text)運(yùn)行這段代碼理論上你應(yīng)該能看到控制臺(tái)輸出圖片中的文字。這就是pytesseract最核心的函數(shù)image_to_string。它的工作流程是接收一個(gè)PIL Image對(duì)象或圖片文件路徑調(diào)用后臺(tái)的Tesseract引擎進(jìn)行處理最后將識(shí)別出的文本作為字符串返回。3.2 核心參數(shù)深度解讀如果只是這樣那也太小看它了。image_to_string函數(shù)有一系列參數(shù)可以極大影響識(shí)別效果。下面我挑幾個(gè)最常用、最重要的來(lái)講。1.lang指定識(shí)別語(yǔ)言這是最重要的參數(shù)之一。Tesseract支持多種語(yǔ)言你需要告訴它圖片里是什么語(yǔ)言。# 識(shí)別英文默認(rèn) text pytesseract.image_to_string(image, langeng) # 識(shí)別簡(jiǎn)體中文 text_chinese pytesseract.image_to_string(image, langchi_sim) # 識(shí)別中英文混合將語(yǔ)言包名用號(hào)連接 text_mix pytesseract.image_to_string(image, langengchi_sim)實(shí)操心得chi_sim代表簡(jiǎn)體中文。如果你安裝了多個(gè)語(yǔ)言包可以像engchi_simfra這樣組合使用但識(shí)別速度會(huì)變慢且可能因語(yǔ)言模型沖突導(dǎo)致準(zhǔn)確率下降。通常只指定最相關(guān)的1-2種語(yǔ)言效果最好。2.config自定義Tesseract配置這個(gè)參數(shù)允許你傳遞復(fù)雜的配置字符串給Tesseract引擎以控制其行為。# 示例只進(jìn)行數(shù)字識(shí)別 custom_config r--oem 3 --psm 6 outputbase digits text pytesseract.image_to_string(image, configcustom_config)這里涉及兩個(gè)關(guān)鍵的子參數(shù)--oem (OCR Engine Mode)選擇OCR引擎模式。0 只使用傳統(tǒng)引擎。1 只使用LSTM神經(jīng)網(wǎng)絡(luò)引擎。2 傳統(tǒng)LSTM引擎混合。3 默認(rèn)基于當(dāng)前版本自動(dòng)選擇最佳模式通常就是LSTM。--psm (Page Segmentation Mode)頁(yè)面分割模式。這個(gè)參數(shù)對(duì)識(shí)別效果影響巨大它告訴Tesseract如何理解圖片中的文本布局。3 全自動(dòng)頁(yè)面分割但不進(jìn)行方向檢測(cè)默認(rèn)。適合大部分情況。6 假設(shè)圖像為統(tǒng)一的文本塊。適合截圖、單行或單塊文字。7 將圖像視為單個(gè)文本行。8 將圖像視為單個(gè)單詞。11 將圖像視為稀疏文本即文字在圖片中分布不規(guī)則。13 原始行將圖像視為單行文本 bypassing hacks that are Tesseract-specific.避坑指南對(duì)于從屏幕上截取的一行驗(yàn)證碼或標(biāo)題使用--psm 7或--psm 8往往比默認(rèn)的3效果更好。對(duì)于一張包含多欄、多段落的掃描文檔圖片使用默認(rèn)或--psm 1自動(dòng)頁(yè)面分割與方向檢測(cè)可能更合適。多試試不同的psm值是優(yōu)化識(shí)別率的捷徑。3. 輸出其他格式除了文本字符串pytesseract還能輸出更結(jié)構(gòu)化的信息。# 輸出為字典包含文本、置信度、位置等詳細(xì)信息 data pytesseract.image_to_data(image, output_typepytesseract.Output.DICT) print(data.keys()) # 查看包含哪些字段如 text, left, top, width, height, conf # 輸出為字符串但包含每個(gè)字符的邊界框和置信度 boxes pytesseract.image_to_boxes(image) print(boxes) # 僅獲取識(shí)別結(jié)果的置信度分?jǐn)?shù)平均或列表 # 需要先獲取完整數(shù)據(jù) data pytesseract.image_to_data(image, output_typepytesseract.Output.DICT) confidences data[conf] non_zero_conf [c for c in confidences if int(c) -1] # 過(guò)濾掉-1代表非文本區(qū)域 if non_zero_conf: avg_conf sum(map(int, non_zero_conf)) / len(non_zero_conf) print(f平均置信度: {avg_conf})利用image_to_data返回的字典你可以精確知道每個(gè)識(shí)別出的單詞或字符在圖片中的坐標(biāo)left,top,width,height和置信度conf范圍0-100。這對(duì)于需要高亮顯示識(shí)別區(qū)域或根據(jù)置信度過(guò)濾結(jié)果的應(yīng)用至關(guān)重要。4. 圖像預(yù)處理大幅提升識(shí)別率的實(shí)戰(zhàn)技巧直接對(duì)原始圖片進(jìn)行OCR效果往往差強(qiáng)人意尤其是面對(duì)手機(jī)拍攝的、光線不均、有傾斜、帶背景噪聲的圖片時(shí)。圖像預(yù)處理是提升Tesseract識(shí)別率的決定性步驟其重要性甚至超過(guò)參數(shù)調(diào)優(yōu)。下面我分享幾個(gè)經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的預(yù)處理流程。4.1 基礎(chǔ)預(yù)處理流程我們使用OpenCV(cv2) 和PIL來(lái)完成這些操作。首先安裝OpenCV:pip install opencv-python。1. 灰度化 (Grayscale)將彩色圖像轉(zhuǎn)換為灰度圖減少計(jì)算維度且Tesseract內(nèi)部其實(shí)也是處理灰度信息。import cv2 image cv2.imread(dirty_image.jpg) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)2. 二值化 (Thresholding)將灰度圖轉(zhuǎn)換為純黑白圖突出文字與背景的對(duì)比。常用方法有簡(jiǎn)單閾值、自適應(yīng)閾值和OTSU算法。# 方法1簡(jiǎn)單閾值適用于背景光照均勻 _, thresh cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 大于150的像素設(shè)為255白否則設(shè)為0黑 # 方法2自適應(yīng)閾值適用于光照不均的圖片 thresh cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 推薦使用這個(gè)魯棒性更強(qiáng)3. 降噪 (Denoising)去除圖像中的椒鹽噪聲或小斑點(diǎn)。# 中值濾波對(duì)椒鹽噪聲效果好 denoised cv2.medianBlur(thresh, 3) # 或使用形態(tài)學(xué)操作開運(yùn)算先腐蝕后膨脹去除小白點(diǎn) kernel cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) opened cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)4. 矯正傾斜 (Deskew)如果文本行是傾斜的識(shí)別率會(huì)急劇下降??梢酝ㄟ^(guò)霍夫變換或最小外接矩形來(lái)檢測(cè)和矯正角度。# 這是一個(gè)簡(jiǎn)化的矯正思路找到所有文本像素點(diǎn)的輪廓計(jì)算最小外接矩形角度 coords np.column_stack(np.where(thresh 0)) angle cv2.minAreaRect(coords)[-1] if angle -45: angle 90 angle # 根據(jù)angle進(jìn)行旋轉(zhuǎn)矯正 (h, w) image.shape[:2] center (w // 2, h // 2) M cv2.getRotationMatrix2D(center, angle, 1.0) corrected cv2.warpAffine(image, M, (w, h), flagscv2.INTER_CUBIC, borderModecv2.BORDER_REPLICATE)4.2 高級(jí)預(yù)處理與實(shí)戰(zhàn)組合拳在實(shí)際項(xiàng)目中我通常會(huì)串聯(lián)多個(gè)步驟形成一個(gè)預(yù)處理管道。下面是一個(gè)處理手機(jī)拍攝文檔的示例def preprocess_for_ocr(image_path): 預(yù)處理管道針對(duì)手機(jī)拍攝的光照不均、有透視變形的文檔 # 1. 讀取圖片 img cv2.imread(image_path) # 2. 調(diào)整大小寬度固定為1000保持比例太大影響速度太小丟失細(xì)節(jié) height, width img.shape[:2] new_width 1000 new_height int((new_width / width) * height) img cv2.resize(img, (new_width, new_height), interpolationcv2.INTER_AREA) # 3. 轉(zhuǎn)換為灰度圖 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 4. 使用CLAHE增強(qiáng)對(duì)比度對(duì)光照不均特別有效 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(gray) # 5. 高斯模糊平滑為閾值化做準(zhǔn)備 blurred cv2.GaussianBlur(enhanced, (5,5), 0) # 6. 自適應(yīng)閾值化 thresh cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 7. 形態(tài)學(xué)操作閉運(yùn)算填充文字內(nèi)部細(xì)小空隙 kernel_close cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) closed cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel_close) # 8. 最終轉(zhuǎn)換為PIL Image對(duì)象供pytesseract使用 final_image Image.fromarray(closed) return final_image # 使用預(yù)處理后的圖片進(jìn)行識(shí)別 processed_img preprocess_for_ocr(your_document_photo.jpg) text pytesseract.image_to_string(processed_img, langchi_simeng) print(text)這個(gè)管道包含了尺寸調(diào)整、對(duì)比度增強(qiáng)、自適應(yīng)閾值和形態(tài)學(xué)處理能應(yīng)對(duì)大多數(shù)質(zhì)量不佳的文檔圖片。核心思想是讓文字部分盡可能成為連貫的、高對(duì)比度的黑色區(qū)域背景則是干凈的白色。5. 常見問(wèn)題排查與性能優(yōu)化實(shí)錄即使按照步驟操作也難免會(huì)遇到各種奇怪的問(wèn)題。下面是我在項(xiàng)目中踩過(guò)的坑和解決方案。5.1 安裝與路徑問(wèn)題問(wèn)題TesseractNotFoundError: tesseract is not installed or its not in your PATH原因系統(tǒng)找不到tesseract命令。解決確認(rèn)Tesseract已正確安裝在終端運(yùn)行tesseract --version。如果已安裝但Python仍報(bào)錯(cuò)可以手動(dòng)在代碼中指定Tesseract的路徑# Windows示例 pytesseract.pytesseract.tesseract_cmd rC:\Program Files\Tesseract-OCR\tesseract.exe # Linux/macOS示例 # pytesseract.pytesseract.tesseract_cmd /usr/local/bin/tesseract將這段代碼放在import pytesseract之后其他調(diào)用之前。問(wèn)題識(shí)別中文時(shí)全是亂碼或空字符串原因沒有安裝中文語(yǔ)言包或者語(yǔ)言包路徑不對(duì)。解決檢查語(yǔ)言包是否安裝。在Tesseract安裝目錄下的tessdata文件夾里查看是否有chi_sim.traineddata文件。如果語(yǔ)言包安裝在非標(biāo)準(zhǔn)路徑可以通過(guò)環(huán)境變量TESSDATA_PREFIX來(lái)指定import os os.environ[TESSDATA_PREFIX] rD:\MyCustomPath\tessdata5.2 識(shí)別準(zhǔn)確率問(wèn)題問(wèn)題識(shí)別結(jié)果錯(cuò)字連篇甚至把數(shù)字“0”識(shí)別成字母“O”排查圖像質(zhì)量這是首要原因。務(wù)必進(jìn)行充分的圖像預(yù)處理見第4部分??梢韵劝杨A(yù)處理后的圖片保存下來(lái)肉眼觀察文字是否清晰、背景是否干凈。--psm參數(shù)這是最容易被忽略的調(diào)優(yōu)點(diǎn)。針對(duì)不同的圖片布局嘗試3,6,7,11等模式。對(duì)于單行文字7或8通常有奇效。語(yǔ)言參數(shù)確保lang參數(shù)設(shè)置正確。中英文混合就用langchi_simeng。自定義字典/模式對(duì)于特定領(lǐng)域的專有名詞如醫(yī)藥、法律Tesseract允許你提供自定義單詞列表??梢詣?chuàng)建一個(gè)文本文件每行一個(gè)單詞然后通過(guò)--user-words your_word_list.txt參數(shù)傳入config。對(duì)于只識(shí)別數(shù)字的場(chǎng)景使用config--psm 6 digits或configoutputbase digits。問(wèn)題識(shí)別速度非常慢優(yōu)化裁剪ROI (Region of Interest)如果只需要識(shí)別圖片的某一部分先用OpenCV或PIL裁剪出來(lái)只對(duì)這部分進(jìn)行識(shí)別。image Image.open(full_image.png) # 假設(shè)感興趣區(qū)域坐標(biāo)為 (x1, y1, x2, y2) roi image.crop((x1, y1, x2, y2)) text pytesseract.image_to_string(roi)降低圖片分辨率對(duì)于大圖在不嚴(yán)重影響文字清晰度的前提下適當(dāng)縮小尺寸能極大提升速度。限制語(yǔ)言包只加載必要的語(yǔ)言包。langengchi_simfradeu會(huì)比langeng慢很多。使用多進(jìn)程如果需要批量處理成千上萬(wàn)張圖片可以考慮使用Python的multiprocessing或concurrent.futures庫(kù)進(jìn)行并行處理。5.3 高級(jí)配置與輸出解析問(wèn)題如何獲取每個(gè)字符或單詞的坐標(biāo)用于在原圖上畫框解決使用image_to_data函數(shù)并解析其返回的字典。import cv2 from PIL import Image import pytesseract image_cv cv2.imread(test.png) data pytesseract.image_to_data(image_cv, output_typepytesseract.Output.DICT) n_boxes len(data[level]) for i in range(n_boxes): # 只處理置信度大于一定閾值的文本例如60 if int(data[conf][i]) 60: (x, y, w, h) (data[left][i], data[top][i], data[width][i], data[height][i]) text data[text][i] # 在OpenCV圖片上畫矩形和文字 cv2.rectangle(image_cv, (x, y), (x w, y h), (0, 255, 0), 2) cv2.putText(image_cv, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.imshow(OCR Result, image_cv) cv2.waitKey(0) cv2.destroyAllWindows()這段代碼會(huì)識(shí)別圖片中的文字并在每個(gè)高置信度的單詞周圍畫上綠色框上方標(biāo)出識(shí)別結(jié)果。問(wèn)題Tesseract輸出了一些奇怪的元信息或警告干擾了結(jié)果解決可以通過(guò)配置參數(shù)來(lái)抑制非文本輸出。在config字符串中加入-c tessedit_create_tsv0等參數(shù)。更直接的方法是在解析image_to_data的結(jié)果時(shí)過(guò)濾掉空文本和低置信度的條目。6. 項(xiàng)目實(shí)戰(zhàn)構(gòu)建一個(gè)簡(jiǎn)易的本地文檔OCR工具理論講得再多不如動(dòng)手做一個(gè)完整的小項(xiàng)目。我們來(lái)構(gòu)建一個(gè)命令行工具它可以接收一個(gè)圖片文件或文件夾路徑進(jìn)行預(yù)處理和OCR最后將結(jié)果保存到文本文件中。6.1 工具設(shè)計(jì)與代碼實(shí)現(xiàn)#!/usr/bin/env python3 簡(jiǎn)易本地OCR工具 功能支持單張圖片或整個(gè)文件夾的批量OCR可指定語(yǔ)言進(jìn)行基礎(chǔ)預(yù)處理。 import argparse import os import sys from pathlib import Path from PIL import Image import pytesseract import cv2 import numpy as np def preprocess_image(image_path): 統(tǒng)一的預(yù)處理函數(shù) # 讀取圖片 img cv2.imread(str(image_path)) if img is None: print(f警告無(wú)法讀取圖片 {image_path}已跳過(guò)。) return None # 轉(zhuǎn)為灰度圖 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自適應(yīng)閾值化 thresh cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 轉(zhuǎn)換為PIL Image return Image.fromarray(thresh) def ocr_image(image_path, langeng, psm3): 對(duì)單張圖片進(jìn)行OCR processed_img preprocess_image(image_path) if processed_img is None: return # 配置Tesseract參數(shù) config f--psm {psm} try: text pytesseract.image_to_string(processed_img, langlang, configconfig) except Exception as e: print(f識(shí)別圖片 {image_path} 時(shí)出錯(cuò): {e}) text return text def main(): parser argparse.ArgumentParser(description簡(jiǎn)易OCR工具) parser.add_argument(input, help輸入文件或文件夾路徑) parser.add_argument(-l, --lang, defaultengchi_sim, help識(shí)別語(yǔ)言例如 eng, chi_sim, engchi_sim) parser.add_argument(-p, --psm, typeint, default3, help頁(yè)面分割模式 (PSM)默認(rèn)為3) parser.add_argument(-o, --output, help輸出文本文件路徑單文件或輸出目錄文件夾) args parser.parse_args() input_path Path(args.input) if not input_path.exists(): print(f錯(cuò)誤路徑 {args.input} 不存在。) sys.exit(1) results {} if input_path.is_file(): # 處理單文件 print(f正在處理文件: {input_path}) text ocr_image(input_path, args.lang, args.psm) results[input_path.name] text # 輸出 if args.output: output_path Path(args.output) # 如果用戶指定了輸出文件則寫入該文件 with open(output_path, w, encodingutf-8) as f: f.write(text) print(f結(jié)果已保存至: {output_path}) else: # 否則打印到控制臺(tái) print(\n--- 識(shí)別結(jié)果 ---) print(text) elif input_path.is_dir(): # 處理文件夾 print(f正在處理文件夾: {input_path}) supported_ext (.png, .jpg, .jpeg, .bmp, .tiff, .gif) image_files [f for f in input_path.iterdir() if f.suffix.lower() in supported_ext] if not image_files: print(文件夾內(nèi)未找到支持的圖片文件。) sys.exit(0) for img_file in image_files: print(f 處理中: {img_file.name}) text ocr_image(img_file, args.lang, args.psm) results[img_file.stem] text # 使用文件名不含后綴作為鍵 # 輸出 if args.output: output_dir Path(args.output) output_dir.mkdir(parentsTrue, exist_okTrue) for filename, text in results.items(): output_file output_dir / f{filename}.txt with open(output_file, w, encodingutf-8) as f: f.write(text) print(f所有結(jié)果已保存至目錄: {output_dir}) else: # 打印匯總 for filename, text in results.items(): print(f\n {filename} ) print(text[:200] ... if len(text) 200 else text) # 只打印前200字符預(yù)覽 if __name__ __main__: # 如果在Windows上遇到路徑問(wèn)題可以在這里指定tesseract_cmd # pytesseract.pytesseract.tesseract_cmd rC:\Program Files\Tesseract-OCR\tesseract.exe main()6.2 工具使用與擴(kuò)展建議將上述代碼保存為ocr_tool.py。你可以在命令行中使用它# 識(shí)別單張圖片結(jié)果保存到 output.txt python ocr_tool.py my_document.jpg -l chi_sim -o output.txt # 識(shí)別一個(gè)文件夾下的所有圖片結(jié)果保存到 ./results 目錄下每個(gè)圖片生成一個(gè)同名的.txt文件 python ocr_tool.py ./images_folder -l engchi_sim -o ./results # 使用PSM模式7單行文本識(shí)別驗(yàn)證碼圖片 python ocr_tool.py captcha.png -l eng --psm 7擴(kuò)展方向圖形界面 (GUI)可以使用tkinter、PyQt或streamlit快速為這個(gè)工具套一個(gè)殼實(shí)現(xiàn)拖拽上傳、實(shí)時(shí)預(yù)覽識(shí)別結(jié)果等功能。集成更多預(yù)處理將第4部分的高級(jí)預(yù)處理管道作為可選參數(shù)加入讓用戶可以選擇“增強(qiáng)模式”。輸出格式多樣化除了TXT還可以支持輸出為Word、PDF或結(jié)構(gòu)化JSON包含文字和坐標(biāo)信息。網(wǎng)絡(luò)API服務(wù)使用Flask或FastAPI將核心功能包裝成一個(gè)HTTP API供其他系統(tǒng)調(diào)用。這個(gè)工具雖然簡(jiǎn)單但涵蓋了從圖像讀取、預(yù)處理、OCR調(diào)用到結(jié)果輸出的完整流程并且考慮了批量處理和基礎(chǔ)錯(cuò)誤處理。你可以以此為基礎(chǔ)根據(jù)實(shí)際需求添加更多功能。