[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()

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


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













avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
python Streamlit連動github程式碼實現YoloV8網頁版偵測物件 先致敬,YoloV8原作Github程式碼 Streamlit網頁 實現YoloV8 偵測物件 套用模型為YoloV8(YOLOv8n)最小模型,因github上傳檔案最大上限為25mb 導入圖像(搜尋街景
python Streamlit連動github程式碼實現YoloV8網頁版偵測物件 先致敬,YoloV8原作Github程式碼 Streamlit網頁 實現YoloV8 偵測物件 套用模型為YoloV8(YOLOv8n)最小模型,因github上傳檔案最大上限為25mb 導入圖像(搜尋街景
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
這次的話題,在有部分的自閉症者,因為照顧者的「給予」,變成不好教自閉症者如何拖地。 因為,重要的是,在照顧者的「傳遞」。 用自閉症者的興趣,做培養動機的媒介 對自閉症者而言,培養動機,需要有興趣和喜好的事物做媒介。 因此,自閉症者的理解速度,比較容易快又泛化。 提升模仿能力,做進一步的建立
Thumbnail
Hi,我是茶桁。 在过去的两讲中,我们已经使用 OpenAI 提供的 Embedding 接口完成了文本分类的功能。现在,我们回到 Completion 接口,这一讲将带你更深入地了解该接口的使用。除此之外,我们还将快速搭建一个有界面的聊天机器人,这将让你更好地理解 Completion 接口的应
剛才上網深入找資料,才知道懲罰的特性,是減少行為。 像是有自閉症者容易搶走他人的物品情況,就有必要改善。 具體說明 見到自閉症者的正懲罰,是以負面性質為主。 在自閉症者搶走他人物品,務必提出負面性質的刺激。 像是,在自閉症者有感官敏銳,就可以藉由〝正懲罰〞進行機會感官減敏。 簡單說,不但可以減少搶他
Thumbnail
原文連結:https://zb.house/nft-投资宝典:什么样的游戏应用值得参与和投资?/ 【本文章轉載自鑄幣局 - 提供專業的加密貨幣行業的研究成果的分析平台。】 "由于Cryptoblade是币安链上的Dapp,加上其庞大的交易量,Skill代币上架币安交易所是有很大可能的。" 角色
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
這次的話題,在有部分的自閉症者,因為照顧者的「給予」,變成不好教自閉症者如何拖地。 因為,重要的是,在照顧者的「傳遞」。 用自閉症者的興趣,做培養動機的媒介 對自閉症者而言,培養動機,需要有興趣和喜好的事物做媒介。 因此,自閉症者的理解速度,比較容易快又泛化。 提升模仿能力,做進一步的建立
Thumbnail
Hi,我是茶桁。 在过去的两讲中,我们已经使用 OpenAI 提供的 Embedding 接口完成了文本分类的功能。现在,我们回到 Completion 接口,这一讲将带你更深入地了解该接口的使用。除此之外,我们还将快速搭建一个有界面的聊天机器人,这将让你更好地理解 Completion 接口的应
剛才上網深入找資料,才知道懲罰的特性,是減少行為。 像是有自閉症者容易搶走他人的物品情況,就有必要改善。 具體說明 見到自閉症者的正懲罰,是以負面性質為主。 在自閉症者搶走他人物品,務必提出負面性質的刺激。 像是,在自閉症者有感官敏銳,就可以藉由〝正懲罰〞進行機會感官減敏。 簡單說,不但可以減少搶他
Thumbnail
原文連結:https://zb.house/nft-投资宝典:什么样的游戏应用值得参与和投资?/ 【本文章轉載自鑄幣局 - 提供專業的加密貨幣行業的研究成果的分析平台。】 "由于Cryptoblade是币安链上的Dapp,加上其庞大的交易量,Skill代币上架币安交易所是有很大可能的。" 角色