[Python]Tesseract OCR的 box 定義

[Python]Tesseract OCR的 box 定義

更新於 發佈於 閱讀時間約 5 分鐘

會打這篇的用意是紀錄一下Tesseract 的 box 定義,先前一直誤會Tesseract 的 box定義的座標跟cv2.rectangle的座標一模一樣,想說自己開發一個辨識OCR位子然後寫入box裡,想說奇怪為什麼印出來的Y軸都有偏移的狀況,是哪裡搞混了,那時候一直以為是做了什麼處理造成辨識的位子有問題,後來上網查才發現原來是Tesseract 的 box 座標定義跟一般認知不同。

Tesseractbox 定義是一種用於表示光學字符識別 (OCR) 結果中每個字符或文字區域的框(bounding box)格式。它提供了每個識別到的字符在圖像中的位置以及該字符的實際內容。這些框資訊通常用於調整或優化 OCR 的結果,特別是在使用像 JTessBoxEditor 等工具進行文字訓練或驗證時。


實際辨識出的OCR位子在畫矩形框起來

raw-image

但用JTessBoxEditor確認寫入的Box是否正確,卻有偏移的狀況

raw-image

Tesseract box 文件的每一行表示一個字符,格式如下:

<character> <left> <bottom> <right> <top> <page>

每個字段的詳細說明如下:

  1. <character>:被 Tesseract 識別的字符內容。例如,這裡可能是一個字母、數字或標點符號。
  2. <left>:字符框的左邊界的 x 坐標。
  3. <bottom>:字符框的下邊界的 y 坐標(圖像的原點位於左上角,因此數值越大表示位置越低)。
  4. <right>:字符框的右邊界的 x 坐標。
  5. <top>:字符框的上邊界的 y 坐標。
  6. <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 坐標

raw-image

修正後的程式碼

將得到的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}'




avatar-img
螃蟹_crab的沙龍
137會員
244內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言
avatar-img
留言分享你的想法!
螃蟹_crab的沙龍 的其他內容
1. 概述 在光學字符識別(OCR)過程中,常見的問題之一是「斷字」,即原本應為一個完整字符的部分被錯誤地分割成兩個或多個獨立的字符。這通常發生在掃描文件、圖像降噪或影像二值化處理後。本篇文章將介紹一種基於 骨架化端點距離分析 的斷字檢測方法,並提供完整的 Python 實作。 2. 斷字檢測的
本教學將介紹如何使用 OpenCV 來檢測螺絲的鎖附間距,並提供完整的 Python 程式碼來實作這項功能。 🔹 1. 設計目標 使用二值化處理與形態學運算來強化影像 計算螺絲之間的間距 視覺化結果,標記最大間距並顯示數值 🔹 2. 測試用螺絲影像 🔹 3.
我們將學習如何使用 Python 和 OpenCV 實現圖像的主色提取與重新著色。 以下的程式碼展示了如何通過 KMeans 聚類演算法分析圖像,提取 HSV 色彩空間中的主色,並將圖像重新著色,提取想偵測的物件的顏色。 在官網案例,實作為RGB色彩空間,但如果套用HSV色彩空間則會因為H色
1. 概述 在光學字符識別(OCR)過程中,常見的問題之一是「斷字」,即原本應為一個完整字符的部分被錯誤地分割成兩個或多個獨立的字符。這通常發生在掃描文件、圖像降噪或影像二值化處理後。本篇文章將介紹一種基於 骨架化端點距離分析 的斷字檢測方法,並提供完整的 Python 實作。 2. 斷字檢測的
本教學將介紹如何使用 OpenCV 來檢測螺絲的鎖附間距,並提供完整的 Python 程式碼來實作這項功能。 🔹 1. 設計目標 使用二值化處理與形態學運算來強化影像 計算螺絲之間的間距 視覺化結果,標記最大間距並顯示數值 🔹 2. 測試用螺絲影像 🔹 3.
我們將學習如何使用 Python 和 OpenCV 實現圖像的主色提取與重新著色。 以下的程式碼展示了如何通過 KMeans 聚類演算法分析圖像,提取 HSV 色彩空間中的主色,並將圖像重新著色,提取想偵測的物件的顏色。 在官網案例,實作為RGB色彩空間,但如果套用HSV色彩空間則會因為H色