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

閱讀時間約 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()

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


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













119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
這次的話題,在有部分的自閉症者,因為照顧者的「給予」,變成不好教自閉症者如何拖地。 因為,重要的是,在照顧者的「傳遞」。 用自閉症者的興趣,做培養動機的媒介 對自閉症者而言,培養動機,需要有興趣和喜好的事物做媒介。 因此,自閉症者的理解速度,比較容易快又泛化。 提升模仿能力,做進一步的建立
Thumbnail
Hi,我是茶桁。 在过去的两讲中,我们已经使用 OpenAI 提供的 Embedding 接口完成了文本分类的功能。现在,我们回到 Completion 接口,这一讲将带你更深入地了解该接口的使用。除此之外,我们还将快速搭建一个有界面的聊天机器人,这将让你更好地理解 Completion 接口的应
剛才上網深入找資料,才知道懲罰的特性,是減少行為。 像是有自閉症者容易搶走他人的物品情況,就有必要改善。 具體說明 見到自閉症者的正懲罰,是以負面性質為主。 在自閉症者搶走他人物品,務必提出負面性質的刺激。 像是,在自閉症者有感官敏銳,就可以藉由〝正懲罰〞進行機會感官減敏。 簡單說,不但可以減少搶他
Thumbnail
原文連結:https://zb.house/nft-投资宝典:什么样的游戏应用值得参与和投资?/ 【本文章轉載自鑄幣局 - 提供專業的加密貨幣行業的研究成果的分析平台。】 "由于Cryptoblade是币安链上的Dapp,加上其庞大的交易量,Skill代币上架币安交易所是有很大可能的。" 角色
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
這次的話題,在有部分的自閉症者,因為照顧者的「給予」,變成不好教自閉症者如何拖地。 因為,重要的是,在照顧者的「傳遞」。 用自閉症者的興趣,做培養動機的媒介 對自閉症者而言,培養動機,需要有興趣和喜好的事物做媒介。 因此,自閉症者的理解速度,比較容易快又泛化。 提升模仿能力,做進一步的建立
Thumbnail
Hi,我是茶桁。 在过去的两讲中,我们已经使用 OpenAI 提供的 Embedding 接口完成了文本分类的功能。现在,我们回到 Completion 接口,这一讲将带你更深入地了解该接口的使用。除此之外,我们还将快速搭建一个有界面的聊天机器人,这将让你更好地理解 Completion 接口的应
剛才上網深入找資料,才知道懲罰的特性,是減少行為。 像是有自閉症者容易搶走他人的物品情況,就有必要改善。 具體說明 見到自閉症者的正懲罰,是以負面性質為主。 在自閉症者搶走他人物品,務必提出負面性質的刺激。 像是,在自閉症者有感官敏銳,就可以藉由〝正懲罰〞進行機會感官減敏。 簡單說,不但可以減少搶他
Thumbnail
原文連結:https://zb.house/nft-投资宝典:什么样的游戏应用值得参与和投资?/ 【本文章轉載自鑄幣局 - 提供專業的加密貨幣行業的研究成果的分析平台。】 "由于Cryptoblade是币安链上的Dapp,加上其庞大的交易量,Skill代币上架币安交易所是有很大可能的。" 角色