[OCR_應用]Tesseract-OCR_擷取字元面積

2024/01/06閱讀時間約 13 分鐘

使用Google Tesseract應用,擷取圖像的OCR並將讀取到的字元標註在原圖上

結果圖

OCR結果圖

OCR結果圖

OCR_Area_list 裡面的資料[{字元:面積}]

OCR_Area_list 裡面的資料[{字元:面積}]

光學字元辨識功能 (Optical character recognition,光學字符辨識)

可以將影像中特徵範圍內的文本轉換為數字形式的文本。使用前必須安装Google Tesseract並更新字庫,安裝檔可在下列公開網址取得

raw-image

Tesseract安裝擋網址

字庫下載

下載的字庫須根據tesseract安裝路徑放置於下列路徑”安裝路徑/Tesseract-OCR/tessdata”

程式碼

import cv2
import pytesseract
import numpy as np
import matplotlib.pyplot as plt

# 讀取圖像
image = cv2.imread('./123456.jpeg')

# 轉換灰階圖像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Tesseract進行辨識
pytesseract.pytesseract.tesseract_cmd = r"C:\Tesseract-OCR\tesseract.exe" #需修改成Tesseract-OCR的路徑
# -c tessedit_char_blacklist 把指定字元Ban掉,不辨識
config = r'-c tessedit_char_blacklist=OTlIi --oem 3 --psm 6'
boxes_data = pytesseract.image_to_boxes(gray_image, lang = 'eng',output_type=pytesseract.Output.STRING, config=config) #取得boxes大小

threshold_value = 150
def getPuTextSize(img):
sz = min(img.shape[:2]) / 500 # 影像短邊 / 500
lw = max(round(sz), 1)
font_sz = max(sz / 3, 1)
return lw, font_sz

def OCR_Area_Fuction(image:np.ndarray,gray_image:np.ndarray,boxes_data:str) -> str :
height, width, _ = image.shape
ocr_str = ''
OCR_Area_list =[] #建立OCR_Area_list 等用來儲存OCR Area用
for box in boxes_data.splitlines():
b = box.split()
#取出字元,位置x,y,長高
char, x, y, w, h = b[0], int(b[1]), int(b[2]), int(b[3]), int(b[4])
roi = gray_image[height - h:height - y, x:w]
# 進行二值化
_, binary_roi = cv2.threshold(roi, threshold_value, 255, cv2.THRESH_BINARY)
# 統計黑色像素
black_pixel_count = roi.size - cv2.countNonZero(binary_roi)
OCR_Area_dit = { char : black_pixel_count }
lw , font = getPuTextSize(roi)
# 繪製矩形框
cv2.rectangle(image, (x, height - y), (w, height - h), (0, 255, 0), 2)
cv2.putText(image, char, (x, height- int(y)), cv2.FONT_HERSHEY_SIMPLEX, font, (255, 0, 0), lw, cv2.LINE_AA)
ocr_str += char
OCR_Area_list.append(OCR_Area_dit)
return ocr_str, OCR_Area_list
ocr_str, OCR_Area_list = OCR_Area_Fuction(image,gray_image,boxes_data)
print(f'OCR_char : {ocr_str}')
print(f'OCR_Area_list : {OCR_Area_list}')
cv2.imshow('OCR_Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

程式碼說明

image = cv2.imread('./123456.jpeg')

這一行程式碼使用 OpenCV 讀取名為 “123456.jpeg” 的圖像文件

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

將彩色圖像轉換為灰階,這樣可以簡化後續的處理。

# 使用Tesseract進行辨識 
pytesseract.pytesseract.tesseract_cmd = r"C:\Tesseract-OCR\tesseract.exe" #需修改成Tesseract-OCR的路徑

設定 Tesseract OCR 的執行路徑,確保程式知道在哪裡找到 Tesseract。

# -c tessedit_char_blacklist 把指定字元Ban掉,不辨識
config = r'-c tessedit_char_blacklist=OTlIi --oem 3 --psm 6'
boxes_data = pytesseract.image_to_boxes(gray_image, lang = 'eng',output_type=pytesseract.Output.STRING, config=config) #取得boxes大小

使用 Tesseract OCR 辨識圖像,同時設定一些參數,如字符黑名單、OCR 引擎模式等。

-c tessedit_char_blacklist=OTlIi: 這部分指定了字符黑名單(blacklist),即在辨識過程中不考慮的字符。在這裡,OTlIi 表示排除大寫字母 'O'、'T',小寫字母 'l'、'I'、'i'。這可以用來排除一些容易混淆的字符,提高辨識的準確性。

--oem 3: 這部分指定 OCR 引擎模式(OCR Engine Mode)。在這裡,3 表示選擇 OEM_TESSERACT_ONLY 模式,僅使用 Tesseract OCR 引擎而不使用 LSTM 引擎。這是一種特定的辨識引擎配置。

--psm 6: 這部分指定了頁面分割模式(Page Segmentation Mode)。在這裡,6 表示使用自動分割,但不進行方向和腳本檢測。這可以適用於單列文本的情況。

threshold_value = 150
def getPuTextSize(img):
# 取得影像短邊的大小,並將其除以 500
sz = min(img.shape[:2]) / 500
# 取最大值,並四捨五入得到線寬
lw = max(round(sz), 1)
# 字型大小為影像短邊的 1/3 或 1(取最大值)
font_sz = max(sz / 3, 1)
return lw, font_sz

設定threshold_value 二值化參數 後續 cv2.threshold用的到

這個函數getPuTextSize是用來計算在圖像上顯示文字時所需的線寬和字型大小

def OCR_Area_Fuction(image: np.ndarray, gray_image: np.ndarray, boxes_data: str) -> str:
height, width, _ = image.shape
ocr_str = '' # 用來儲存辨識的文字
OCR_Area_list = [] # 用來儲存每個辨識區域的黑色像素數量

for box in boxes_data.splitlines():
b = box.split()
# 取出字元,位置 x, y,長寬 w, h
char, x, y, w, h = b[0], int(b[1]), int(b[2]), int(b[3]), int(b[4])
# 提取 ROI(Region of Interest),即辨識區域
roi = gray_image[height - h:height - y, x:w]
# 進行二值化處理
_, binary_roi = cv2.threshold(roi, threshold_value, 255, cv2.THRESH_BINARY)
# 統計黑色像素數量
black_pixel_count = roi.size - cv2.countNonZero(binary_roi)
OCR_Area_dit = {char: black_pixel_count} # 將黑色像素數量與對應的字元建立成字典
lw, font = getPuTextSize(roi) # 取得文字的線寬和字型大小
# 繪製矩形框
cv2.rectangle(image, (x, height - y), (w, height - h), (0, 255, 0), 2)
# 在圖像上放置文字
cv2.putText(image, char, (x, height - int(y)), cv2.FONT_HERSHEY_SIMPLEX, font, (255, 0, 0), lw, cv2.LINE_AA)
ocr_str += char
OCR_Area_list.append(OCR_Area_dit) # 將該辨識區域的黑色像素數量加入列表

return ocr_str, OCR_Area_list

這個函數 OCR_Area_Fuction 主要用於處理 Tesseract OCR 的辨識結果,同時計算每個辨識區域的黑色像素數量,並在原始圖像上繪製相應的矩形框和文字。

這個函數的主要步驟包括:

  1. 分割和提取信息: 對 Tesseract 辨識的結果進行分割,提取出每個辨識區域的相關信息,如字元、位置等。
  2. 計算黑色像素數量: 對每個辨識區域進行二值化處理,然後統計黑色像素的數量。
  3. 繪製矩形框和文字: 在原始圖像上根據辨識的位置信息繪製矩形框和放置文字。
  4. 儲存結果: 將辨識的文字組合成字符串,同時將每個辨識區域的黑色像素數量儲存到列表中。

最終,函數返回辨識的文字和每個辨識區域的黑色像素數量列表。

ocr_str, OCR_Area_list = OCR_Area_Fuction(image,gray_image,boxes_data)
print(f'OCR_char : {ocr_str}')
print(f'OCR_Area_list : {OCR_Area_list}')
cv2.imshow('OCR_Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出辨識的文字和相應的黑色像素數量,並以視窗形式顯示帶有標記的圖像。


若有問題歡迎提問,愛心 追蹤~













49會員
87內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!