【多媒體 AI 工具實戰】#02 Unlimited-OCR 快速看懂:從圖片萃取文字,Vibe Coder 必知

測驗:用 Unlimited-OCR 從圖片萃取文字

共 5 題,點選答案後會立即顯示結果

1. 根據文章,OCR(光學字元辨識)的核心作用是什麼?

  • A. 把純文字檔轉換成圖片
  • B. 把圖片裡的文字認出來,變成可複製、可搜尋的純文字
  • C. 幫圖片去除雜訊並美化畫質
  • D. 把 PDF 壓縮成更小的檔案

2. 文章提到「什麼時候不該用 OCR」?

  • A. 圖片是彩色的時候
  • B. 文字是中文的時候
  • C. 資料本來就是可選取文字的 PDF 或 HTML,應直接抽文字
  • D. 圖片超過一頁的時候

3. 在下面這段最小範例中,result.text 代表什麼?

ocr = OCR(lang=”ch”) image = Image.open(“receipt.png”) result = ocr.read(image) print(result.text)
  • A. 整張圖辨識到的文字接成一大串字串
  • B. 圖片檔案的路徑名稱
  • C. 每段文字在圖上的座標位置
  • D. 引擎對辨識結果的信心分數

4. 文章建議辨識前對照片/掃描件做「影像前處理」,下列哪個是文中提到的常見做法?

  • A. 把圖片放大到原本的十倍
  • B. 把圖片存成 JPG 格式
  • C. 把圖片加上浮水印
  • D. 轉灰階、二值化、旋轉校正(deskew)

5. 批次處理多張圖並存成 txt 時,文章特別強調哪個細節以避免中文亂碼?

  • A. 檔名要用英文
  • B. 寫檔時要指定 encoding="utf-8"
  • C. 每張圖都要先轉成 PNG
  • D. 語言參數要設成 lang="en"

【多媒體 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)

這段代碼做了什麼

  1. 載入 OCR 引擎,並告訴它「這張圖大概是什麼語言」。
  2. 把圖片檔讀進記憶體。
  3. 跑辨識(ocr.read),回傳一個結果物件。
  4. 從結果裡拿出 .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,各自存成一個 .txtencoding="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,通常先用 pdf2imagePyMuPDF 把每頁轉成圖再辨識。
  • 表格還原:有專門的 table recognition 功能,把辨識結果重建成 Markdown/CSV 表格,比自己排座標省事。
  • 繁簡與多語混合:同一張圖中英夾雜時,語言參數怎麼設會影響結果,多數工具支援多語模型。
  • GPU 加速:大量圖片時,OCR 引擎能用 GPU 跑快很多,這是效能問題不是正確性問題,量大再研究。

進階測驗:用 Unlimited-OCR 從圖片萃取文字

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 情境判斷 情境題

AI 交出一段 OCR 程式,會把辨識結果直接存進資料庫: text = ocr.read(image).text save_to_database(text) 這批圖片是掃描的「銀行對帳單」,含金額與帳號。 你身為驗收者,最該要求 AI 補上什麼?
  • A. 把 text 全部轉成大寫再存
  • B. 改用更快的 GPU 加速辨識
  • C. 在存檔前標記出信心分數過低的行,讓人工抽驗,避免錯字直接進資料庫
  • D. 把圖片改存成 PNG 格式再辨識

2. 情境判斷 情境題

你要辨識一份「雙欄排版」的期刊文件, AI 目前的程式直接印出 result.text, 結果左右兩欄的文字被交錯接在一起,讀起來像亂碼。 最合適的處理方式是?
  • A. 提高 lang 參數的語言數量
  • B. 改用每行的 box 座標,先分欄、再由上到下排序後輸出
  • C. 把圖片轉灰階就能自動修正順序
  • D. 把 confidence 門檻調高

3. 情境判斷 情境題

你手上有一份「可以直接選取文字」的原生 PDF 合約, 主管要你把裡面的條款抽出來做搜尋。 依文章觀點,最恰當的做法是?
  • A. 先把 PDF 每頁截圖,再丟 OCR,準確率最高
  • B. 一定要用 OCR,否則搜尋不到文字
  • C. 先把 PDF 印出來拍照再 OCR
  • D. 直接抽取 PDF 既有文字,不必繞去 OCR(OCR 會平白引入錯字率)

4. 錯誤診斷 錯誤診斷

同事拿手機拍了一張「有點歪、光線偏暗」的合約照片, 直接跑: result = ocr.read(Image.open(“skewed_dark_photo.jpg”)) print(result.text) 輸出錯字非常多。最可能的根本原因是?
  • A. 沒做任何前處理(灰階/二值化/旋轉校正),歪又暗的原圖直接辨識
  • B. Pillow 版本太舊,需要升級
  • C. 沒有用 with 開啟檔案
  • D. print 應該改成 logging

5. 錯誤診斷 錯誤診斷

一張只有 80px 高、模糊的小截圖,AI 這樣處理: img = Image.open(“tiny_screenshot.png”) img = img.resize((img.width*5, img.height*5)) # 放大 5 倍 result = ocr.read(img) 辨識結果依然是一堆亂猜的字。為什麼放大救不回來?
  • A. 放大倍率不夠,應放大 20 倍
  • B. 原圖字高不足、已經糊掉,放大只是放大糊塊,補不回原本不存在的細節,應改用更高解析度原圖
  • C. resize 用錯函式,應該用 crop
  • D. 因為沒設 lang 參數

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *