會打這篇的用意是紀錄一下Tesseract 的 box 定義,先前一直誤會Tesseract 的 box定義的座標跟cv2.rectangle
的座標一模一樣,想說自己開發一個辨識OCR位子然後寫入box裡,想說奇怪為什麼印出來的Y軸都有偏移的狀況,是哪裡搞混了,那時候一直以為是做了什麼處理造成辨識的位子有問題,後來上網查才發現原來是Tesseract 的 box 座標定義跟一般認知不同。
Tesseract
的 box
定義是一種用於表示光學字符識別 (OCR) 結果中每個字符或文字區域的框(bounding box)格式。它提供了每個識別到的字符在圖像中的位置以及該字符的實際內容。這些框資訊通常用於調整或優化 OCR 的結果,特別是在使用像 JTessBoxEditor 等工具進行文字訓練或驗證時。
Tesseract box 文件的每一行表示一個字符,格式如下:
<character> <left> <bottom> <right> <top> <page>
每個字段的詳細說明如下:
例如:
A 123 456 789 1234 0
這行表示字符 "A" 的 bounding box 其左上角的坐標為 (123, 1234),右下角的坐標為 (789, 456),並且它位於第 0 頁。
這些 box 定義在進行 OCR 訓練時十分重要,因為它們允許你為每個字符提供準確的框來幫助優化模型的識別效果。
img_h, img_w = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
labels = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(labels, connectivity=8)
# stats = (x,y,w,h)
x = state[0]
y = state[1]
x1 = state[0] + state[2]
y1 = state[1] + state[3]
# for tessract box
data = f'{ocr} {x} {y} {x1} {y1} {Image_index}'
原來box定義的Y軸是由下到上,所以Top頂點就會跟一般邏輯是相反的,就由圖片高度減去辨識到的Y軸就是字符框的上邊界的 y 坐標。
將得到的OCR座標與長寬,轉換一下就等於Tesseract box的格式了
img_h, img_w = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
labels = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(labels, connectivity=8)
# stats = (x,y,w,h)
x = state[0]
y = state[1]
x1 = state[0] + state[2]
y1 = state[1] + state[3]
# for tessract box
# tessract box <character> <left> <bottom> <right> <top> <page>
left = x
right = x1
top = img_h - y
bottom = top - state[3]
data = f'{ocr} {left} {bottom} {right} {top} {Image_index}'