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


留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
300內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2025/03/24
在影像處理或機器學習的應用中,我們常常需要將影片逐幀擷取出來,進一步進行辨識或分析。 本篇教學將示範如何使用 Python + OpenCV 來: ✅ 讀取 MP4 影片 測試影片可由下方超連結下載,從file-examples.com下載 file-examples.com 是一個 免費提
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/11
本文將指導你如何修改現有的 OpenCV 程式碼,使其利用 CUDA 加速進行深度神經網絡(DNN)推理,如超分辨率圖像放大任務。這將顯著提升運行速度,特別是在高分辨率圖像處理中。 在CMake上這選項要開,才可支援DNN模組。 CMake編譯OpenCV教學文 連結 [OpenCV][Py
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
2024/10/10
OpenCV 提供了專門針對 CUDA 優化的模組,這些模組使用 cv2.cuda 命名空間,並且可以直接使用 GPU 進行加速。,cv2.cuda 模塊需要在 OpenCV 編譯時啟用 CUDA 支援才能使用。 本文主要比較經過CMAKE重新編譯OpenCV使其支援Cuda,原OpenCV只支援
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
1. 概述 在光學字符識別(OCR)過程中,常見的問題之一是「斷字」,即原本應為一個完整字符的部分被錯誤地分割成兩個或多個獨立的字符。這通常發生在掃描文件、圖像降噪或影像二值化處理後。本篇文章將介紹一種基於 骨架化端點距離分析 的斷字檢測方法,並提供完整的 Python 實作。 2. 斷字檢測的
Thumbnail
1. 概述 在光學字符識別(OCR)過程中,常見的問題之一是「斷字」,即原本應為一個完整字符的部分被錯誤地分割成兩個或多個獨立的字符。這通常發生在掃描文件、圖像降噪或影像二值化處理後。本篇文章將介紹一種基於 骨架化端點距離分析 的斷字檢測方法,並提供完整的 Python 實作。 2. 斷字檢測的
Thumbnail
本文主要介紹使用Numpy實現一個尋找邊界的方法,在用這個方法延伸去判斷2D條碼中圖案L角,根據預定義的方向角度對應表來判斷圖像的角度(0 度、90 度、180 度或 270 度) 設計邏輯 數據過濾: 函式 __filtered_positions 確保在對數據進行處理之前,能夠有效地過濾
Thumbnail
本文主要介紹使用Numpy實現一個尋找邊界的方法,在用這個方法延伸去判斷2D條碼中圖案L角,根據預定義的方向角度對應表來判斷圖像的角度(0 度、90 度、180 度或 270 度) 設計邏輯 數據過濾: 函式 __filtered_positions 確保在對數據進行處理之前,能夠有效地過濾
Thumbnail
本文介紹如何使用OpenCV的分水嶺演算法來實作硬幣的影像分割。除了官方範例外,還加入取出分割後物件的中心點來標註的功能。透過二值化、距離圖、前景圖、分割背景圖等步驟,最後應用分水嶺演算法進行硬幣的分割。本文也提供程式範例及圖示逐步解析演算法。
Thumbnail
本文介紹如何使用OpenCV的分水嶺演算法來實作硬幣的影像分割。除了官方範例外,還加入取出分割後物件的中心點來標註的功能。透過二值化、距離圖、前景圖、分割背景圖等步驟,最後應用分水嶺演算法進行硬幣的分割。本文也提供程式範例及圖示逐步解析演算法。
Thumbnail
Basic python data structure
Thumbnail
Basic python data structure
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News