2026年9月17日 星期四

AGY神器 ,對PNG 圖像檔🖼️ 之 OCR文字辨識 拆解

針對 PNG 圖像(例如 來源圖檔.png)如何透過 OCR(光學字元辨識)與電腦視覺 (Computer Vision) 精準辨識並拆解考題,進行費曼實體比喻、物理管線拆解與程式碼物理意義解構。

💡 費曼 (FEYNMAN) 實體生活比喻解說

「想像 PNG 考題圖片是一張印有複雜考題的實體試紙,而 Python 是戴著高科技放大鏡的考古學家:」
  1. cv2.imread(p)(掃描器將紙張放進閱卷機)
    就像考古學家拿到試紙時,先將試紙放進 4K 掃描器,將紙上的文字、網格與數字轉換成由「紅綠藍 (RGB) 像素顆粒」組成的實體矩陣,不遺漏任何微小細節。
  2. cv2.cvtColor(img, COLOR_BGR2GRAY) + 大津二值化(用黑白顯影劑去斑)
    試紙上可能有些許黃漬、陰影或彩色背景(如綠色 Start 塊、紅色 Goal 塊)。這就像噴上黑色化學顯影劑,去除所有干擾顏色,只保留「純黑文字」與「純白背景」,讓字跡邊緣清晰銳利。
  3. cv2.findContours()(用美工刀將題目裁切為獨立區塊)
    考古學家拿起美工刀,依照紙上的線條框線,把試紙分割成三個獨立零件(均屬PNG圖檔片段資訊分段區塊拆解):
    • 頂部:【題目敘述區塊】(題目文字與條件)
    • 左下:【Q 值數據表格區塊】(動作與數值)
    • 右下:【3 × 3 網格地圖區塊】(S 與 G 位置)
  4. pytesseract.image_to_string()(速記員逐字聽寫與公式符號還原)
    速記員拿起放大鏡盯著每個切出來的區塊,把圖形字跡翻譯成純文字 (0,0), ε = 0, Q值 以及選項 (A) (B) (C) (D),並送入 程式評體內進行科學推演!

🔬 PNG 考題 OCR 拆解管線三大實體階段 (Physical Pipeline Breakdown)

💜【Phase 1: 二進位標頭與矩陣加載 (Header Scan & Matrix Load)】
 PNG 檔案 (Binary) ---> cv2.imread() / PIL.Image ---> 驗證 Magic Bytes (\x89PNG\r\n\x1a\n) & 構建 HxWxC 像素矩陣 (0.005 秒完成通道校驗,確認影像解析度與顏色空間如 BGR/RGBA) 💜 【Phase 2: 圖像預處理與區域切割 (CV Preprocessing & ROI Extraction)】 
 PNG 像素矩陣 (Height x Width x Channel) 
                       ▼
【灰階化 & 灰階直方圖均衡】 (cv2.cvtColor -> Gray)  
                       ▼ 
 【OTSU 自適應二值化 (Thresholding)】 
 (將文字與背景分開,消除背景色塊噪聲) 
                                  ▼ 
 ┌────────────────┴──────────────┐ 
 【ROI 矩形邊界輪廓探測】           【降噪與膨脹侵蝕 (Morphology)
 (cv2.findContours)                       (cv2.dilate/erode 清除破損字體邊緣)  └────────────────┬───────────────┘  
                                             ▼
            產出獨立 ROI 區塊 (Text_ROI, Table_ROI, Grid_ROI) 

💜 【Phase 3: 雙軌 OCR  (Dual-Track OCR 】   ┌───────────────┴───────────────┐ 
【Tesseract / EasyOCR 辨識軌】                       【 專家對位軌】
 (抽取 0.50, 0.80, ε=0, (0,0) 等實體 Token)           (將數值注入進行推理)               
            ▼                                                                             ▼ 
 產出 JSON Struct (q_table: 
{Up:0.5, Down:0.8})                                            產出 專家級解析文案

🛠️ 程式碼片段之物理意義解構 (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圖片轉文字Tesseract套件

AGY神器 拆解MP4影音檔