測驗:用 Unlimited-OCR 從圖片萃取文字
共 5 題,點選答案後會立即顯示結果
1. 根據文章,OCR(光學字元辨識)的核心作用是什麼?
2. 文章提到「什麼時候不該用 OCR」?
3. 在下面這段最小範例中,result.text 代表什麼?
4. 文章建議辨識前對照片/掃描件做「影像前處理」,下列哪個是文中提到的常見做法?
5. 批次處理多張圖並存成 txt 時,文章特別強調哪個細節以避免中文亂碼?
【多媒體 AI 工具實戰】#02(共 3 篇)|難度:L2-進階
前置:基本 Python 與命令列、已讀過本系列 #01(熟悉「最小範例+驗收」的閱讀節奏)
一句話說明
把圖片裡的文字「認」出來,變成你可以複製、搜尋、再處理的純文字。
OCR = Optical Character Recognition(光學字元辨識)。你手上有一張截圖、掃描的合約、拍照的菜單,眼睛看得到字,但電腦只當它是一堆像素。OCR 就是那個「幫電腦把像素翻譯成文字」的步驟。Unlimited-OCR 是這類工具的一個代表,特色是不限頁數/字數、支援多語言、可以吐出純文字或帶座標的版面結果。
Unlimited-OCR 是什麼、什麼時候用它
先建立正確的期待,這樣你才驗收得動 AI 交出來的東西。
它吃什麼(輸入):
| 輸入類型 | 舉例 | 好不好辨識 |
|---|---|---|
| 掃描檔 | 掃描的 PDF 合約、書頁 | 好(乾淨、正的) |
| 截圖 | 網頁截圖、App 畫面 | 好(數位原生、清晰) |
| 照片 | 手機拍的菜單、白板、名片 | 看情況(歪、反光、糊就難) |
| PDF 轉圖 | 把 PDF 每頁轉成圖再辨識 | 好,但要先做「PDF→圖片」這步 |
它吐什麼(輸出):
- 純文字:整張圖的文字接成一串字串,最常用。
- 含座標的結構:每一段文字 + 它在圖上的位置(bounding box)+ 信心分數。要做「只抓某個欄位」「重建表格」時才需要。
什麼時候「不」該用 OCR:如果你的資料本來就是可選取文字的 PDF 或 HTML,直接抽文字就好,不要繞去 OCR。OCR 是「只剩圖片、沒有原始文字」時的救援手段,它一定會有錯字率。
30 秒最小範例
先看一段「載入圖片 → 執行辨識 → 印出文字」的最小可執行程式。不同 OCR 套件 API 名字略有差異,但骨架都長這樣。
# 安裝(示意;實際套件名以工具文件為準)
uv add unlimited-ocr pillow
Code language: PHP (php)from unlimited_ocr import OCR # 匯入 OCR 引擎
from PIL import Image # Pillow:讀圖片用
ocr = OCR(lang="ch") # 建立引擎,指定語言(中文)
image = Image.open("receipt.png") # 讀入一張圖片
result = ocr.read(image) # 執行辨識,這是最耗時的一步
print(result.text) # 印出辨識到的純文字
Code language: PHP (php)這段代碼做了什麼:
- 載入 OCR 引擎,並告訴它「這張圖大概是什麼語言」。
- 把圖片檔讀進記憶體。
- 跑辨識(
ocr.read),回傳一個結果物件。 - 從結果裡拿出
.text(純文字)印出來。
跑完你應該在終端機看到收據上的文字被印出來。這就是驗收的第一關:有沒有東西出來。
逐行翻譯
ocr = OCR(lang="ch") # 開一台「辨識機器」,設定它主要認中文;認英文常用 "en"
image = Image.open("x.png") # 把圖片從硬碟讀進來,變成程式能處理的物件
result = ocr.read(image) # 把圖片餵進機器,等它回傳結果(慢的話是正常的)
result.text # 結果裡的「全部文字接成一串」
result.lines # 結果裡的「一行一行」,通常還帶位置與信心分數
Code language: PHP (php)看到 lang="ch" 就知道語言是要指定的。這點很關鍵——下面紅旗會講,語言設錯是常見坑。
核心概念翻譯
| 你會看到 | 意思 |
|---|---|
lang="ch" / lang="en" |
告訴引擎主要認什麼語言,設錯辨識率會爛掉 |
result.text |
全部文字接成一大串(最常用) |
result.lines |
一行一行的結果,每行帶座標 + 信心分數 |
box / bbox |
bounding box,文字在圖上的位置框(左上、右下座標) |
confidence / score |
引擎對這段辨識「有多少把握」,0~1,越低越可疑 |
Image.open(...) |
Pillow 讀圖片,OCR 前的標準第一步 |
.convert("L") |
把圖轉灰階,常見的前處理第一招 |
AI 最常這樣用
用法 1:辨識前先做影像前處理(提高準確率)
照片/掃描件常常歪、暗、有雜訊。AI 通常會先「洗一下圖」再辨識。
from PIL import Image
img = Image.open("photo.jpg")
img = img.convert("L") # 轉灰階:去掉顏色干擾
img = img.point(lambda p: 0 if p < 140 else 255) # 二值化:非黑即白,讓字更清楚
result = ocr.read(img)
Code language: PHP (php)翻譯:辨識前先把圖片「洗乾淨」——轉灰階、拉高對比,字跟背景分得更開,OCR 會認得更準。歪掉的圖還會加一步旋轉校正(deskew)。
用法 2:批次處理整個資料夾
一次跑幾十張圖,AI 常寫成迴圈。
from pathlib import Path
for path in Path("scans").glob("*.png"): # 抓 scans 資料夾裡每一張 png
result = ocr.read(Image.open(path)) # 逐張辨識
out = path.with_suffix(".txt") # 對應的輸出檔名,例如 a.png -> a.txt
out.write_text(result.text, encoding="utf-8") # 把文字存成同名 txt
print(f"{path.name} 完成")
Code language: PHP (php)翻譯:把資料夾裡每張圖都跑一遍 OCR,各自存成一個 .txt。encoding="utf-8" 很重要,中文沒設它容易變亂碼。
用法 3:只要高信心的結果 / 拿座標重建版面
for line in result.lines: # 一行一行看
if line.confidence < 0.6: # 信心太低的先標記出來,人工複查
print("可疑:", line.text, line.box)
Code language: CSS (css)翻譯:把引擎「沒把握」的行挑出來給人看。做表格或多欄版面時,還會用 line.box 的座標,依上到下、左到右重新排序,避免文字順序錯亂。
🚩 紅旗
AI 交出來的 OCR 程式「看起來都會動」,以下四種要特別警覺。
🚩 1:直接信任辨識結果,完全沒驗證
text = ocr.read(image).text
save_to_database(text) # 🚩 一個字都沒比對就存進資料庫 / 拿去計算
Code language: PHP (php)OCR 一定有錯字率(把 0 認成 O、把「日」認成「曰」)。用在金額、帳號、身分證這種地方,一個字錯就是事故。
跟 AI 這樣說:「幫我在存檔前,把 confidence 低於 0.8 的行標記出來,並印出總行數和低信心行數,方便我人工抽驗。」
🚩 2:圖片解析度過低還硬跑
img = Image.open("tiny_screenshot.png") # 只有 80px 高的模糊小圖
result = ocr.read(img) # 🚩 圖太小太糊,出來的字幾乎是亂猜
Code language: PHP (php)字的高度太小(一般建議每個字至少 20~30 像素高),OCR 會亂認。放大一張已經糊掉的圖救不回細節。
跟 AI 這樣說:「這張圖解析度很低,先幫我檢查圖片尺寸,如果字高不足就提醒我改用更高解析度的原圖,不要硬辨識。」
🚩 3:沒有任何前處理,直接丟原始照片
result = ocr.read(Image.open("skewed_dark_photo.jpg")) # 🚩 歪的、暗的、反光的原圖直接丟
Code language: PHP (php)手機拍的照片常常是斜的、光線不均。不做灰階/二值化/旋轉校正就辨識,準確率會掉很多,而且你不會知道是「圖爛」還是「OCR 爛」。
跟 AI 這樣說:「幫這段加上基本前處理:轉灰階、旋轉校正(deskew)、二值化,並讓我可以存出前處理後的圖檢查效果。」
🚩 4:多欄/表格版面,文字順序被打亂
print(result.text) # 🚩 兩欄的文件,左右兩欄的字被交錯接在一起,讀起來像亂碼
Code language: PHP (php)result.text 預設可能只是「由上到下」硬接,遇到雙欄排版、表格,順序會錯亂,語意整個跑掉。
跟 AI 這樣說:「這是雙欄/表格版面,不要直接用 text。請用每行的 box 座標,先分欄再由上到下排序後輸出,並保留欄位對應關係。」
Vibe Coder 驗收檢查點
不用會寫 OCR,但這幾件事你一定做得到:
- [ ] 拿一張真實截圖跑一次:用你自己的圖跑最小範例,確認終端機真的印出文字,而不是空字串或報錯。
- [ ] 逐字比對錯字率:把辨識結果跟原圖並排看,數一下 100 個字裡錯幾個。金額/帳號類文件錯字率要接近 0 才能收。
- [ ] 確認欄位/行順序正確:多欄或表格文件,檢查輸出的文字順序跟原圖一致,沒有左右欄交錯。
- [ ] 檢查中文沒亂碼:存檔那行有沒有
encoding="utf-8";打開.txt看中文是否正常。 - [ ] 問 AI 有沒有驗證機制:貼程式碼問「這段有沒有處理辨識信心太低的情況?低信心的結果會被標記還是直接用掉?」
- [ ] 換一張爛圖測 robustness:故意丟一張歪的或糊的圖,看程式是報錯、警告、還是默默給你一堆錯字(默默給錯字最危險)。
看不懂就這樣問 AI
把程式碼整段貼給 AI,然後問:
「用白話一行一行解釋這段 OCR 程式在幹嘛,我是初學者。特別告訴我:它有沒有做圖片前處理?辨識結果有沒有驗證?語言參數設對了嗎?」
要驗收品質時可以問:
「假設這張是手機拍的、有點歪的合約照片,這段程式最可能在哪裡出錯?幫我列出 3 個風險點和對應的檢查方式。」
延伸:知道就好(遇到再查)
- PDF → 圖片:OCR 不直接吃 PDF,通常先用
pdf2image或PyMuPDF把每頁轉成圖再辨識。 - 表格還原:有專門的 table recognition 功能,把辨識結果重建成 Markdown/CSV 表格,比自己排座標省事。
- 繁簡與多語混合:同一張圖中英夾雜時,語言參數怎麼設會影響結果,多數工具支援多語模型。
- GPU 加速:大量圖片時,OCR 引擎能用 GPU 跑快很多,這是效能問題不是正確性問題,量大再研究。
進階測驗:用 Unlimited-OCR 從圖片萃取文字
共 5 題,包含情境題與錯誤診斷題。