► 前言
上篇介紹使用OpenCV Python對於圖像上的二值化操作,二值化主要用途包括圖像分割、物體偵測、文字識別等。這種轉換可以幫助檢測圖像中的物體或特定特徵,並提取有用的信息,本篇基於二值化操作進行近一步的操作,透過影像梯度區分影像前景、後景,框選所需目標物件。透過程式碼的說明,讓各位了解OpenCV Python於圖像處理上的基本操作。
►輪廓(Contour)定義 輪廓是由多個點組成的連續曲線或多邊形,這些點會包圍物體或形狀的邊界。輪廓描述了物體在影像中的外形和輪廓的形狀。這些輪廓提供了對物體形狀和結構的描述,可以識別和理解影像中的物體。
►輪廓檢測與繪製
OpenCV提供findContours()函數用於在二值化影像中尋找輪廓。
- image: 輸入的二值化圖像,通常是經過灰度轉換和二值化處理後的圖像。
- mode: 輪廓檢測模式。它指定輪廓的檢索模式,可以使用以下值之一:
- RETR_EXTERNAL:只檢測最外層的輪廓。
- RETR_LIST:檢測所有的輪廓,但不建構輪廓的層次結構。
- RETR_CCOMP:檢測所有的輪廓,並將其組織為兩級層次結構。
- RETR_TREE:檢測所有的輪廓,並將其組織為完整的層次結構。
- method: 輪廓的逼近方法。它指定輪廓的逼近方法,可以使用以下值之一:
- CHAIN_APPROX_NONE:儲存所有的輪廓點,不進行逼近。
- CHAIN_APPROX_SIMPLE:僅儲存水平、垂直和對角線端點,壓縮水平、垂直和對角線節點,只保留該方向上的終點。
- contours(可選): 輪廓的輸出列表,每個輪廓是一個由點構成的 numpy 數組。
- hierarchy(可選): 輸出的層次結構,描述了輪廓之間的嵌套關係。
- offset(可選): 輸入圖像的可選偏移參數。
並透過drawContours()函數將輪廓疊加於原始圖像上。
- image: 用於繪製輪廓的圖像。
- contours: 要繪製的輪廓,是一個包含輪廓的列表,每個輪廓是一個由點構成的 numpy 數組。
- contourIdx: 指定要繪製的輪廓的索引。如果為負值(例如 -1),則繪製所有輪廓。
- color: 繪製輪廓的顏色。它是一個包含三個整數的元組,分別表示藍色、綠色和紅色通道的值。
- thickness(可選): 繪製輪廓的線條寬度。如果 thickness 為正值,表示線條的粗細;如果 thickness 為負值或者等於 0,則輪廓內部被填充。
- lineType(可選): 繪製輪廓的線條類型。預設為 LINE_8,表示 8 連通線條。你也可以使用 cv2.LINE_AA 以獲得抗鋸齒效果。
- hierarchy(可選): 描述輪廓層次結構的 numpy 數組。在 findContours 中獲取,通常不需要手動指定。
- maxLevel(可選): 繪製輪廓的最大層級。如果不指定,則繪製所有層級的輪廓。
- offset(可選): 輸入圖像的可選偏移參數。
在輪廓檢測與繪製分為以下四個步驟: - 讀取圖像並轉為灰度圖
- 灰度圖像二值化
- 檢測輪廓
- 繪製輪廓
►輪廓周長與面積計算 在 OpenCV 中,可以使用 cv2.arcLength 函數來計算輪廓的周長,使用 cv2.contourArea 函數來計算輪廓的面積。
- contour:要計算周長的輪廓。
- closed:一個布爾值,表示輪廓是否是封閉的。如果是封閉的,則 closed 設為 True;如果不是封閉的,則設為 False。
►小結 透過以上講解,搭配程式碼進行範例講解,相信各位對於圖像上的輪廓檢測能有更深刻的理解,期待下一篇博文吧! ►Q&A
問題一:圖像不是二值化的,如何進行輪廓檢測? 在進行輪廓檢測之前,必須將圖像轉換為二值化形式。可以使用灰度轉換和閾值處理來實現。確保你的圖像經過適當的預處理。
問題二:找不到預期的輪廓,檢測效果不好。 調整二值化的閾值或使用自適應閾值處理。有時候,圖像的光線和對比度變化可能導致檢測效果不佳,可以先進行適當的圖像增強。
問題三:圖像中有噪音或小的斑點,影響輪廓檢測。 在進行輪廓檢測之前,進行圖像平滑處理,例如使用高斯濾波器或中值濾波器,以減少噪音的影響。 問題四:輪廓太多或太少,難以準確識別目標。 調整二值化的閾值,以控制檢測到的輪廓數量。另外,可以使用形態學運算進行輪廓的調整和修復。 問題五:輪廓檢測後如何進一步處理找到的輪廓? 根據應用需求,可以使用輪廓的特性進行進一步的篩選、過濾或分析。例如,可以根據輪廓的面積、長寬比等進行篩選,以排除不需要的輪廓。 |