[OpenCV][Python]利用連通域分析來過濾雜點

閱讀時間約 1 分鐘

先前文章有使用連通域分析來印出物件的位置及高寬面積及達成物件定位等功能。

[OpenCV應用][Python]利用連通域分析達成物件定位

[OpenCV基礎][Python]connectedComponent連通域分析

[OpenCV][Python]印出圖像中OCR面積及位置

這次我們將利用它來達成過濾掉不重要的雜點,在先前的文章中有利用OpenCV找輪廓的方式來濾除,這一次我們利用連通域分析來設定更多條件濾除。

[OpenCV基礎][Python]遮罩,旋轉,輪廓應用濾除斑點

先上結果圖

左邊是原圖有一推雜點跟痕跡,右邊是我們設定條件濾除掉的結果。只保留想檢測OCR的部分。

raw-image


程式範例

import cv2
import numpy as np

def __connectorFileter(binaryImg: np.array , obj_Spec: tuple) -> np.array:
'''
binaryImg : 輸入的二值化圖像,僅包含0255的值。
obj_Spec :
obj_Spec: tuple:一個元組,用來定義要過濾物件的規格
WidthMax:物件的最大寬度
HeightMin:物件的最小高度
HeightMax:物件的最大高度
AreaMin:物件的最小面積
'''
WidthMin,WidthMax,HeightMin,HeightMax,AreaMin = obj_Spec
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binaryImg, connectivity=8)

imgH, imgW = binaryImg.shape
obj = set()
objLoc = {}

# 移除雜訊區塊
if True:
for i in range(len(stats)): #x, y, w, h = stats[i][:4]
# 排除法
# 物件座標
if stats[i][0] == 0 or stats[i][1] == 0:
continue
# 物件邊界
if stats[i][0] + stats[i][2] >= imgW or stats[i][1] + stats[i][3] >= imgH:
continue
# 物件寬度
if stats[i][2] < WidthMin or stats[i][2] > WidthMax:
continue
# 物件高度
if stats[i][3] < HeightMin or stats[i][3] >= HeightMax:
continue
# 物件面積
if stats[i][4] <= AreaMin:
continue
objLoc[i] = (stats[i][0], stats[i][1], stats[i][2], stats[i][3])

# 移除字母內的瑕疵
for i in obj:
noise = False
left_i = objLoc[i][0]
right_i = objLoc[i][0]+ objLoc[i][2]
top_i = objLoc[i][1]
bottom_i = objLoc[i][1]+objLoc[i][3]
for j in objLoc:
left_j = objLoc[j][0]
right_j = objLoc[j][0]+ objLoc[j][2]
top_j = objLoc[j][1]
bottom_j = objLoc[j][1]+objLoc[j][3]
if i != j and left_j < left_i and right_i< right_j and top_j< top_i and bottom_i < bottom_j:
noise = True
break
if not noise:
obj.add(i)

# 字母保留區塊
for i in range(num_labels):
if i in letters:
labels[labels == i] = True
else:
labels[labels == i] = False
# convert to binary image
labels[labels>0]=255
labels[labels==0]=0
labels = np.array(labels, dtype='uint8')

return labels

if __name__ == "__main__" :
# 讀取圖檔
imgpath ='F:/python/opencv/chars_training_dirty.png'
img = cv2.imdecode(np.fromfile(file=imgpath, dtype=np.uint8), cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Otsu's 方法進行自動二值化
threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# 需讓OCR轉換成白色字體才能用連通域分析
threshold_img = 255 - threshold_img

#設定過濾條件
Filete_spec = (10,100,10,100,200)
Fileter_img = __connectorFileter(threshold_img,Filete_spec)

#顯示結果圖
cv2.imshow('Orignal_img',threshold_img)
cv2.imshow('Fileter_img',Fileter_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


__connectorFileter 函式的關鍵步驟:

  1. cv2.connectedComponentsWithStats
    這個函式用來標記二值影像中的連通區域,並返回四個值:
    • num_labels:標記的連通區域數量。
    • labels:標記圖,每個像素標記屬於哪個連通區域。
    • stats:每個區域的統計資訊,如邊界框(x, y, w, h)和面積。
    • centroids:每個區域的質心。
  2. 雜訊過濾與物件篩選
    使用for迴圈遍歷每個物件,根據以下條件過濾物件:
    • 物件是否靠近影像邊界(排除位於邊界的物件)。
    • 物件的寬度、高度是否在指定範圍內。物件的面積是否大於指定的最小面積。
    • 篩選出的物件會存入objLoc字典,記錄它們的座標和尺寸。
  3. 內部瑕疵移除
    • 檢查物件之間是否有較小的物件完全包裹在另一個較大的物件內部,這些內部的物件視為瑕疵,會被移除。
  4. 物件保留區塊
    • 將符合條件的物件標記為True,其他的標記為False,最後將labels轉換回二值化影像(0和255兩個值)。

函式返回:

  • labels: np.array:最後經過處理的二值化影像,其中保留了符合規格的物件,移除了雜訊和瑕疵。

其他要點:

  • set():用來儲存符合條件的物件索引。
  • 物件座標檢查:會透過邊界(寬高、座標)及面積條件進行嚴格的過濾,避免雜訊影響分析結果。


116會員
185內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
本文主要使用pyzbar 與pylibdmtx來讀取條碼,並用靜態方法將這兩個套件的讀碼功能包裝起來,因應不同需求,調用相對應的方法來讀取QR code,一維條碼,Data Matrix。最後再將讀到的條碼資料與框選條碼位子於原圖上。
這次我們使用影像差分處理,用來檢測圖像中的瑕疵。 首先定義瑕疵樣態,以下原圖為例,較淡的可能是錫油的反光,較亮的部分可能是瑕疵或者是刮痕造成,那我們的目的就是檢測出這些瑕疵或者是刮痕。
yield 在影像處理中也是蠻好用的,特別是當你需要處理大量影像或希望逐步處理影像時。它可以用來生成一個影像流,讓你能夠一次處理一張影像而不需要一次性加載所有影像進記憶體。 yield 是 Python 中的一個關鍵字,用於創建生成器(generator)。 生成器是一種特殊類型的迭代器,允許你
透過 Python 的 tracemalloc 模組來比較兩種方法在執行過程中佔用的記憶體大小。以下是兩者的記憶體佔用比較範例。 程式說明 tracemalloc.start():開始追踪記憶體分配。 tracemalloc.get_traced_memory():返回當前和峰值的記憶體使用量
現在有一推AI網站提供模糊圖片變高清的工具,Google關鍵字一下就一推了,例如MyEdit,Artguru等等。 Python的OpenCV有提供一個DnnSuperResImpl Class Reference,也可以做到這件事,就讓我們繼續往下看吧。 在OpenCV DnnSuperRe
現在的圖片都蠻大張的,若整張丟下去做AVI檢測,相對的時間會要比較久一點,事先擷取出感興趣的區域來檢測,就會縮短整個測試的時間。 本文主要提供一個擷取ROI的函式。 從圖片中裁剪出指定的感興趣區域(ROI)。 def crop_img(img, x, y, h, w): """
本文主要使用pyzbar 與pylibdmtx來讀取條碼,並用靜態方法將這兩個套件的讀碼功能包裝起來,因應不同需求,調用相對應的方法來讀取QR code,一維條碼,Data Matrix。最後再將讀到的條碼資料與框選條碼位子於原圖上。
這次我們使用影像差分處理,用來檢測圖像中的瑕疵。 首先定義瑕疵樣態,以下原圖為例,較淡的可能是錫油的反光,較亮的部分可能是瑕疵或者是刮痕造成,那我們的目的就是檢測出這些瑕疵或者是刮痕。
yield 在影像處理中也是蠻好用的,特別是當你需要處理大量影像或希望逐步處理影像時。它可以用來生成一個影像流,讓你能夠一次處理一張影像而不需要一次性加載所有影像進記憶體。 yield 是 Python 中的一個關鍵字,用於創建生成器(generator)。 生成器是一種特殊類型的迭代器,允許你
透過 Python 的 tracemalloc 模組來比較兩種方法在執行過程中佔用的記憶體大小。以下是兩者的記憶體佔用比較範例。 程式說明 tracemalloc.start():開始追踪記憶體分配。 tracemalloc.get_traced_memory():返回當前和峰值的記憶體使用量
現在有一推AI網站提供模糊圖片變高清的工具,Google關鍵字一下就一推了,例如MyEdit,Artguru等等。 Python的OpenCV有提供一個DnnSuperResImpl Class Reference,也可以做到這件事,就讓我們繼續往下看吧。 在OpenCV DnnSuperRe
現在的圖片都蠻大張的,若整張丟下去做AVI檢測,相對的時間會要比較久一點,事先擷取出感興趣的區域來檢測,就會縮短整個測試的時間。 本文主要提供一個擷取ROI的函式。 從圖片中裁剪出指定的感興趣區域(ROI)。 def crop_img(img, x, y, h, w): """
你可能也想看
Google News 追蹤
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度 [OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度 本文將用不同的方法,利用Numpy
Thumbnail
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
本專欄將提供給您最新的市場資訊、產業研究、交易心法、精選公司介紹,以上內容並非個股分析,還請各位依據自身狀況作出交易決策。歡迎訂閱支持我,獲得相關內容,也祝您的投資之路順遂! 每年 $990 訂閱方案👉 https://reurl.cc/VNYVxZ 每月 $99 訂閱方案👉https://re
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
此篇為上一篇文章的延伸,先辦別是螺絲還是螺母才擷取出影像。 [OpenCV應用][Python]利用findContours辨識螺絲還是螺母 因為可能會需要另外處理螺絲與螺母才可以準確地去做量測,所以第一步就是先分割出這兩種的圖像。
Thumbnail
本文將介紹影像的基本操作包括:影像的讀取、顯示、保存,以及一些常見的操作如裁剪、旋轉、縮放等。 語法介紹 讀取影像: cv2.imread函數的參數是影像的檔案路徑。讀取後的影像以NumPy的ndarray形式表示。
Thumbnail
大部分在求物件的寬度及高度,都會想到用OpenCV的findContours函式來做,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度 [OpenCV應用][Python]利用findContours找出物件邊界框求出寬度及高度 本文將用不同的方法,利用Numpy
Thumbnail
本文將利用OpenCV的findContours函式,從找到的輪廓中來計算物件的面積,周長,邊界框等屬性,從而得到物體的寬度與高度。 一般來說,我們在進行輪廓檢測時,會先進行圖像二值化,將對象轉換為白色,背景為黑色。這樣,在找到輪廓後,輪廓的點就會以白色表示,背景為黑色。 結果圖 從圖中綠色框
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉