介紹使用OpenCV Python findContours() 函數用於在二值化影像中尋找連通的白色區域,並返回一系列點的集合來表示找到的輪廓。本篇將介紹基於計算影像的梯度,通過在影像中找到梯度值的變化來識別邊緣,邊緣檢測通常用於預處理步驟,以幫助後續的物體偵測、分割或其他影像處理任務。透過程式碼的說明,讓各位了解OpenCV Python於圖像處理上的基本操作。
►邊緣檢測定義 邊緣檢測是指在數字圖像中尋找並識別物體邊界的過程。在影像處理中,邊緣通常表示著圖像中不同區域之間的劇烈變化或不連續性,這些變化可能由物體的幾何結構、亮度、顏色或紋理等特徵引起。邊緣檢測的目標是找到這些變化的位置,以便進一步的分析和處理,例如物體偵測、圖像分割、特徵提取等。常見的邊緣檢測算法有Canny邊緣檢測、Sobel算子、Laplacian算子等。
►Canny邊緣檢測 OpenCV提供Canny ()函數用於在灰度影像中尋找輪廓。由於邊緣偵測容易受到影像中雜訊的影響,因此用 5x5 高斯濾波器去除影像中的雜訊。然後使用 Sobel 在水平和垂直方向上對平滑後的圖像進行濾波,獲得水平方向上的一階導數(?? )和垂直方向(??),如下所示: 獲得梯度大小和方向後,對影像進行全面掃描,以去除可能不構成邊緣的任何不必要的像素,因此在每個像素處,檢查像素是否是其鄰域中梯度方向的局部最大值。 最後透過兩個閾值minVal 和 maxVal,進行邊緣判斷,梯度大於 maxVal 的任何邊緣是圖像邊緣,而低於 minVal 的邊緣不是圖像邊緣。 ►Sobel算子 Sobel 算子是一種離散的微分算子,結合了高斯平滑和微分求導運算。利用局部差分尋找邊緣,計算梯度的近似值。 ►Laplacian算子 Laplacian算子採用二階導數來偵測邊緣,因為二階導數在邊緣位置為零,透過二階倒數運算便可以得知邊緣位置。 ►小結 透過以上講解,搭配程式碼進行範例講解,相信各位對於圖像上的邊緣檢測能有更深刻的理解,期待下一篇博文吧!
►Q&A 問題一:如何在OpenCV中進行邊緣偵測? 在 OpenCV 中,可以使用 cv2.Canny() 函數進行邊緣偵測。此函數需要輸入灰階影像,並且通常需要調整兩個閾值參數來控制邊緣偵測的靈敏度。
問題二:如何選擇適當的閾值參數進行邊緣檢測? 選擇適當的閾值參數取決於影像的特性以及應用需求。一般來說,可以透過試驗不同的參數值並觀察結果來進行調整。較低的閾值會導致更多的邊緣被偵測出來,而較高的閾值則會限制偵測到的邊緣數量。
問題三:如何對邊緣偵測結果進行後處理? 邊緣檢測常常會產生一些斷斷續續的邊緣,因此可以對檢測結果進行後處理來提高品質。常見的後處理步驟包括二值化、非最大值抑制和邊緣連接等。
問題四:如何在不同的影像類型上進行邊緣檢測? OpenCV 的邊緣偵測函數通常接受灰階影像作為輸入,因此對於彩色影像,需要先將其轉換為灰階影像。可以使用 cv2.cvtColor() 函數將彩色影像轉換為灰階影像。
問題五:如何顯示邊緣檢測結果? 顯示邊緣偵測結果與顯示原始影像類似。可以使用 cv2.imshow() 函數顯示影像,然後透過 cv2.waitKey() 等待按鍵輸入,並最後使用 cv2.destroyAllWindows() 關閉所有視窗。
►參考資料 |