手機拍的文件方向不對,先處理 EXIF 再送 OCR
手機裡的合約照片看著是豎的,上傳後卻橫了過來。原因可能是像素本身沒有旋轉,檢視器只是根據 EXIF 方向標記調整了顯示。 OCR 輸入如果忽略該標記,就會讀到另一個方向的頁面。
手機拍的合約照片在相簿裡是垂直的,上傳後卻變成橫的,很多人會以為照片拍歪了或文件出錯。這篇文章寫給需要把手機照片送進 OCR 或翻譯流程的人,幫你分辨「顯示方向」和「像素方向」這兩件事。
讀完後,你會了解 EXIF 方向標記是什麼、Pillow 用哪個函數處理它,以及哪些問題它解決不了。範例使用合成樣本,程式碼已在隔離環境中做過檢查,但這不代表對所有真實文件或產品效果的保證。處理重要文件前,請先保留原件,並依文中的邊界與驗收項複審。
手機拍的文檔方向不對怎麼辦?一句話結論
先用 ImageOps.exif_transpose 應用 EXIF 方向標記,再把調整後的圖送入 OCR; 傾斜和透視問題要另外處理。
| 你的情況 | 推薦做法 | 原因 |
|---|---|---|
| 檢視器顯示正常,但解析結果橫置 | 先用 ImageOps.exif_transpose 應用 EXIF 方向 | 像素未旋轉,只有顯示圖層做了調整 |
| 照片整體輕微傾斜 | 單獨評估傾斜校正 | exif_transpose 不處理拍攝角度 |
| 紙張呈梯形 | 檢測紙張邊界後做透視校正 | 透視變形不屬於 EXIF 方向問題 |
| 需要保存 OCR 返回的框 | 同時記錄輸入尺寸、方向變換與輸出尺寸 | 調整後的圖座標與原圖不同 |
顯示方向與像素方向要分開看
手機照片的像素本身可能沒有旋轉,檔案裡的 EXIF 方向標記告訴檢視器該如何顯示它。檢視器會據此調整畫面,OCR 引擎若忽略這個標記,就會讀到另一個方向的頁面。
Pillow 的 ImageOps.exif_transpose 會根據方向資訊調整像素,並移除已套用的方向標記,避免後續再次旋轉。它處理的是 EXIF 方向,不是任意拍攝傾斜或透視變形。把手機歪拍的紙張拉正,仍需要另一套幾何處理。
用合成像素測試旋轉邊界
下面的程式碼以合成圖片檢查方向標記是否正確套用:
from PIL import Image, ImageOps
source = Image.new("RGB", (40, 20), "white")
source.putpixel((0, 0), (255, 0, 0))
source.getexif()[274] = 6
fixed = ImageOps.exif_transpose(source)
assert fixed.size == (20, 40)
assert fixed.getpixel((19, 0)) == (255, 0, 0)
assert fixed.getexif().get(274) is None
assert source.size == (40, 20)
again = ImageOps.exif_transpose(fixed)
assert again.size == fixed.size
assert again.tobytes() == fixed.tobytes()
這裡用角落的紅像素幫助檢查幾何關係,沒有呼叫 OCR 引擎,也沒有模擬真實文字。因此測試只能支持「方向標記被正確應用」這一結論,不能支持「文字辨識率提高多少」。示例依赖 Pillow,应在锁定版本中运行。
對方向異常做分流
遇到方向問題時,先看現象,再判斷原因。下表可以幫你決定下一步:
| 觀察 | 可能原因 | 下一步 |
|---|---|---|
| 檢視器正常、解析器橫置 | EXIF 未應用 | 檢查方向標籤與像素 |
| 整頁輕微傾斜 | 拍攝角度 | 獨立評估傾斜校正 |
| 頁面呈梯形 | 透視變形 | 偵測紙張邊界後校正 |
| 文字上下顛倒但無標記 | 元資料缺失 | 根據頁面內容判斷,不盲猜 |
座標記錄要從旋轉後開始
如果 OCR 在調整後的圖上回到文字框,框的座標就對應調整後的圖,而不是最初拍攝的圖。因此需要保留三樣資訊:輸入尺寸、方向變換和輸出尺寸。展示高亮時,再對座標應用逆變換,回到原圖位置。
只保存一組框,卻不記錄它屬於哪張圖,高亮位置就會偏離文字。
翻譯前先把圖放正
通過OmniDoc(產品入口)的 OCR 與翻譯入口處理掃描材料時,可以先對照原件確認方向。 方向、透視和清晰度是三個不同的檢查項,需要分別確認。
輸入條件整理清楚之後,再用雙語結果判斷翻譯品質。如果一遇到漏字就歸因於翻譯模型,往往會漏掉真正的輸入問題。
參考資料:Pillow ImageOps。
📊 核心對比
| 處理對象 | 處理方式 | 是否由 exif_transpose 完成 |
|---|---|---|
| EXIF 方向標記 | 按標記調整像素 | 是 |
| 整頁輕微傾斜 | 拍攝角度校正 | 否,需獨立評估 |
| 頁面呈梯形 | 透視校正 | 否,需偵測紙張邊界 |
🎯 哪一種做法適合你?
如果你…
- 檢視器正常、OCR 結果橫置:先套用 EXIF 方向,再重新送入 OCR。
- 照片整體歪斜:把傾斜校正作為獨立步驟,不要指望方向處理解決。
- 紙張邊緣呈梯形:先偵測紙張邊界,再做透視校正。
- 需要高亮原圖位置:儲存輸入尺寸與變換訊息,展示時再做逆變換。
❓ 常見問題(FAQ)
1. exif_transpose 能把歪拍的紙張拉正嗎?
不能。它只根據 EXIF 方向標記調整像素,不處理拍攝角度或透視變形,這些需要另外的幾何處理。
2. 為什麼檢視器顯示正常,OCR 結果卻是橫的?
檢視器會套用 EXIF 方向標記,而像素本身可能沒有旋轉。 OCR 如果忽略該標記,就會讀到另一個方向的頁。
3. 範例程式碼能說明辨識率提高了多少嗎?
不能。範例以合成像素檢查方向標記是否正確應用,沒有呼叫 OCR 引擎,也沒有模擬真實文字。
4. OCR 回傳的框為什麼會和原圖位置對不上?
如果 OCR 是在調整後的圖上運行,框的座標對應調整後的圖。需記錄輸入尺寸、變換與輸出尺寸,展示時再做逆變換。
📝 總結
手機照片的方向問題,先看顯示方向還是像素方向,再分別處理方向、傾斜、透視。處理重要文件前,請保留原件並完成複審。


