[OpenCV][Python]印出圖像中文字的位置及高寬

閱讀時間約 7 分鐘

本文將說明如何去辨識出圖片文字​位置及高寬。

印出結果

raw-image

測式圖

raw-image


程式碼

import cv2
import numpy as np

def read_posion(img):
'''
輸入背景黑色,物件白色的圖
'''
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(img, connectivity=8)
components = []
# boxes_data = []
for i in range(1, num_labels): # 跳過背景
x, y, w, h, _ = stats[i]
components.append((x, y, w, h))

components.sort(key=lambda c: c[0]) # 按 x 座標排序

# 合併 x 軸在正負5範圍內的OCR
merged_components = []
current_component = list(components[0])

for i in range(1, len(components)):
if abs(components[i][0] - current_component[0]) <= 5:
current_component[0] = min(current_component[0], components[i][0]) # X 取最小值
current_component[1] = min(current_component[1], components[i][1]) # Y 取最小值
current_component[2] = max(current_component[2], components[i][2]) # w 取最大值
current_component[3] = abs(components[i][1] - current_component[1]) + components[i][3] # h 取 Y2 - Y1 + H2
else:
merged_components.append(tuple(current_component[:4]))
current_component = list(components[i][:4])

#合併最後一個OCR結果
merged_components.append(tuple(current_component[:4]))

return merged_components

img = cv2.imread(f'圖片路徑')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
box = read_posion(gray_img)

for i,data in enumerate(box):
x,y,h,w = data
#印出OCR 位置,高寬
print(f'第{i}個OCR,x:{x},y:{y},h:{h},w:{w}')



函式詳細說明

  1. 函式定義和參數:
    • read_posion(img) 函式接受一個參數
    • img:輸入的二值化圖像,背景是黑色,物件是白色。
  2. 計算連通域:
    num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(img, connectivity=8)
    • 使用 OpenCV 的 connectedComponentsWithStats 函數計算連通域
    • num_labels:連通域的數量。
    • labels:標籤圖,每個連通域有一個唯一的標籤。
    • stats:每個連通域的統計資料(x, y, w, h, area)。
    • _:忽略的中心點資料。
  3. 提取連通域並存入列表:
    components = []
    for i in range(1, num_labels): # 跳過背景
    x, y, w, h, _ = stats[i]
    components.append((x, y, w, h))
    • 遍歷 stats,跳過背景,提取每個連通域的位置信息和尺寸,存入 components 列表。
  4. 按 x 座標排序:
    components.sort(key=lambda c: c[0])
    • 將 components 按 x 座標進行排序。
  5. 合併相鄰的連通域:
    merged_components = []
    current_component = list(components[0])

    for i in range(1, len(components)):
    if abs(components[i][0] - current_component[0]) <= 5:
    current_component[0] = min(current_component[0], components[i][0]) # X 取最小值
    current_component[1] = min(current_component[1], components[i][1]) # Y 取最小值
    current_component[2] = max(current_component[2], components[i][2]) # w 取最大值
    current_component[3] = abs(components[i][1] - current_component[1]) + components[i][3] # h 取 Y2 - Y1 + H2
    else:
    merged_components.append(tuple(current_component[:4]))
    current_component = list(components[i][:4])

    merged_components.append(tuple(current_component[:4]))
    • 初始化 merged_components 列表和 current_component。
    • 遍歷 components 列表,如果當前組件與前一組件的 x 座標差值在正負5範圍內,則合併它們。
    • 合併後的結果存入 merged_components。
  6. 返回合併後的元件資訊:
    return merged_components
    • 返回合併後的元件資訊,這些資訊包括每個連通域的 x, y, w, h(左上角座標和寬高)。



更進階的應用,如何增加文字中的間隔

[OpenCV][Python]OCR分割及增加間隔[單排文字]

avatar-img
128會員
210內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
在某些特殊情況下,需要將圖片進行黑白反轉,例如Tesseract(OCR辨識引擎)就有建議黑底白字的狀況下辨識率較高。 本文將使用 NumPy 進行影像黑白反轉,並顯示反轉前後的影像。
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
接續上一邊,分割了螺絲與螺母的圖像,但分割後的結果,因為螺絲過於接近的關係,沒有切割乾淨,會有其他螺絲的頭或者身體,這樣會影響到後續量測。 [OpenCV應用][Python]擷取出螺絲或螺母的影像 本文主要是,如何去除掉不要的背景雜物。 下層為原先分割的圖,上層為去除背景雜物的圖。
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
你可能也想看
Google News 追蹤
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。