[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分割及增加間隔[單排文字]

108會員
162內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
你可能也想看
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
Frames per second簡稱FPS, 也就是每秒幾個幀數的意思, 平常我們看到的影片背後其實都是一張張圖片的組成, 而這一幅畫面就是影片的每一幀。 由於人眼的特殊生理結構, 畫面的幀數只要高於每秒10 - 12張的時候就會認為是連貫的, 這也就是為什麼電影膠片是一格格的拍攝出來, 但是藉
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
Frames per second簡稱FPS, 也就是每秒幾個幀數的意思, 平常我們看到的影片背後其實都是一張張圖片的組成, 而這一幅畫面就是影片的每一幀。 由於人眼的特殊生理結構, 畫面的幀數只要高於每秒10 - 12張的時候就會認為是連貫的, 這也就是為什麼電影膠片是一格格的拍攝出來, 但是藉
Thumbnail
當我們在進行影像處理時, 在Python的世界最常聽到的就是OpenCV, 而我們在處理影片時也會想要僅針對某時間段的影片進行處理, 今天我們就來教您如何透過OpenCV來讀取特定的時間區段。 在進入主題之前, 有一些基本概念務必先行建立, 一個影片是由多張圖片組成的, 因此最小單元為一張圖
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
繼上次分享的「【🔒 影像辨識 - 影像處理】Ep.1 關於影像的基本單位, 相信我們對於影像的儲存應該有了基本的認識了, 那麼接下來我們會需要的是了解顏色的組成。 我們除了在文章裡講述概念之外, 也會提供實作的數位作品分享給大家, 請大家根據範例學習與練習。 關於顏色 灰階的時代 早期尚未
Thumbnail
歡迎來到「阿Han的軟體心法實戰營 - 影像處理」系列的文章區,我們會針對影像處理的相關知識、開發技巧進行分享,並教你手把手用程式寫出屬於自己的影像處理程式, 當然也會包括AI模型訓練的部分,就讓我們一起來探索影像處理的領域吧! 在進入影像辨識的世界之前, 我們先來了解一下關於解析度的基本概念吧!
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib