針對 PNG 圖像(例如 來源圖檔.png)如何透過 OCR(光學字元辨識)與電腦視覺 (Computer Vision) 精準辨識並拆解考題,進行費曼實體比喻、物理管線拆解與程式碼物理意義解構。
💡 費曼 (FEYNMAN) 實體生活比喻解說
cv2.imread(p)(掃描器將紙張放進閱卷機):
就像考古學家拿到試紙時,先將試紙放進 4K 掃描器,將紙上的文字、網格與數字轉換成由「紅綠藍 (RGB) 像素顆粒」組成的實體矩陣,不遺漏任何微小細節。cv2.cvtColor(img, COLOR_BGR2GRAY)+ 大津二值化(用黑白顯影劑去斑):
試紙上可能有些許黃漬、陰影或彩色背景(如綠色 Start 塊、紅色 Goal 塊)。這就像噴上黑色化學顯影劑,去除所有干擾顏色,只保留「純黑文字」與「純白背景」,讓字跡邊緣清晰銳利。cv2.findContours()(用美工刀將題目裁切為獨立區塊):
考古學家拿起美工刀,依照紙上的線條框線,把試紙分割成三個獨立零件(均屬PNG圖檔片段資訊分段區塊拆解):- 頂部:【題目敘述區塊】(題目文字與條件)
- 左下:【Q 值數據表格區塊】(動作與數值)
- 右下:【3 × 3 網格地圖區塊】(S 與 G 位置)
pytesseract.image_to_string()(速記員逐字聽寫與公式符號還原):
速記員拿起放大鏡盯著每個切出來的區塊,把圖形字跡翻譯成純文字(0,0),ε = 0,Q值以及選項(A) (B) (C) (D),並送入 程式評體內進行科學推演!
🔬 PNG 考題 OCR 拆解管線三大實體階段 (Physical Pipeline Breakdown)
🛠️ 程式碼片段之物理意義解構 (Code Breakdown)
1️⃣ cv2.imread(img_path)(二進位矩陣加載與像素對位)
import cv2
# 物理意義:0.005 秒內將 PNG 檔案還原為 H x W x C 的 3D 物理陣列
img = cv2.imread(img_path)
h, w, c = img.shape
# 目的:建立圖像實體空間座標系,確保後續裁切 (Crop) 與文字區塊定位時不會發生矩陣邊界溢出 (Index Error)。
2️⃣ cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)(自適應二值化)
# 物理意義:計算全圖灰階直方圖雙峰,自動尋找最佳閥值,將顏色壓平為純黑 (0) 與純白 (255)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 目的:消除「S 綠色區塊」、「G 紅色區塊」及題目背景淡藍色等干擾,讓 OCR 引擎(Tesseract)專注於高對比度的文字黑邊。
3️⃣ cv2.findContours()(ROI 考題區域組件分割)
# 物理意義:在二進位圖片中尋找閉合輪廓,進行佈局分析 (Layout Analysis)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w_box, h_box = cv2.boundingRect(cnt)
if w_box > 50 and h_box > 20: # 過濾微小雜訊
roi = img[y:y+h_box, x:x+w_box]
# 目的:自動定位圖片中的「Q值數據表格」與「選項文字區」,達成組件級 (Component-level) 的分割採樣。
4️⃣ pytesseract.image_to_string(roi, config='--psm 6')(文字實體辨識與 Token 注入)
import pytesseract # 物理意義:使用預訓練神經網路將 ROI 圖像陣列轉換成 UTF-8 實體字串 text_data = pytesseract.image_to_string(gray, lang='cht+eng', config='--psm 6') # 參數物理意義: # --psm 6 : 假設圖像為單一統一文字區塊 (Assume a single uniform block of text) # lang='cht+eng' : 同時載入繁體中文與英文/數學符號模型 # 目的:精確抽取 "ε=0", "Q值", "0.80" 等關鍵 Key-Value 隊列,並直接注入進行解答計算。💢OCR精進參考資訊:
1. 「消除光照不均與陰影」?
Otsu 是全域統計,無法感知空間坐標 $(x, y)$ 的光強漸變。如強行對漸層陰影試卷套用 Otsu,陰影落差處會直接生成巨大的黑色色塊(Black Artifacts),使任何文字偵測(Text Detection)框選全部失敗可能性。
2. 「濾除紙張泛黃與背面透墨」?
若背面透墨(Bleed-through)極淡,且紙張整體光照高度均勻,Otsu 的單一閾值確實可能剛好切在正面墨跡與背面弱透墨之間。
盲點參考: 當正面筆畫較細或有鉛筆字(手寫答案)時,鉛筆的灰階反差常常比背面深印透墨還要微弱。Otsu 會直接把淺色鉛筆跡裁掉,反而留下深色透墨。在文件處理領域,去除透墨的標準做法是利用物理多光譜/色彩空間轉換(例如轉至 LAB 空間提取色度差)或形態學雙邊濾波(Bilateral Filter),而非粗暴的二值化。
3. 「強化細節與筆畫邊緣,避免 c/o、8/B 混淆」?
數位相機拍攝的微觀邊緣存在點擴散函數(PSF, Point Spread Function)與相機內建的雙線性插值,筆劃邊緣呈現「抗鋸齒(Anti-aliasing)」的灰階平滑過渡。
深度學習模型(如 ResNet / Transformer)能利用平滑邊緣的微小梯度差異分辨
c的缺口或是8的交錯點。若直接做硬性切分的 Otsu 二值化,高頻雜訊會被放大,導致缺口黏連(
c變成o)或細筆劃直接截斷(8斷成兩截變成兩個零或無效形狀)。4.文件影像 OCR 前處理的最佳實踐(Best Practices)
空間光照均勻化(Illumination Normalization): 利用形態學大核開運算(Morphological Opening with Large Kernel)或低通高斯平滑估算背景照度場 $I_{\text{bg}}(x, y)$,再進行除法或減法補償:
$$I_{\text{norm}}(x, y) = \frac{I(x, y)}{I_{\text{bg}}(x, y)} \times 255$$此步驟直接抹平全圖的陰影與光照不均,同時完整保留原始灰階資訊。
對比度增強(保留灰階階調): 使用 CLAHE(對比度受限自適應直方圖均衡化),在局部區塊增強鉛筆字反差,避免放大高頻噪聲。
透墨與雜斑抑制: 使用導向濾波(Guided Filter)或非局部均值去噪(Non-Local Means),保留筆畫幾何結構。
送入現代 OCR: 直接以處理後的灰階圖或 RGB 圖送入深度學習模型(如 PaddleOCR / DBNet + SVTR),交由模型內部的卷積核自適應學習空間特徵,而非 全域硬性二值化。
相關資訊:OCR圖片轉文字Tesseract套件AGY神器 拆解MP4影音檔