一、findcontours函數介紹
在計算機視覺和圖像處理中,輪廓是一個形狀的邊界,由連續的點組成。findcontours函數是OpenCV中處理輪廓的重要函數之一,它用於找到二值圖像中所有物體的輪廓。
二、findcontours函數解析
findcontours函數的基本語法如下:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
其中,參數image表示輸入的二值圖像;mode表示輪廓的檢索模式,有RETR_EXTERNAL、RETR_LIST、RETR_CCOMP和RETR_TREE等模式可供選擇;method表示輪廓的近似方法,有CHAIN_APPROX_NONE、CHAIN_APPROX_SIMPLE、CHAIN_APPROX_TC89_KCOS等方法可供選擇。contours表示輸出的輪廓,hierarchy表示輪廓的層次信息,offset表示進行輪廓查找時的偏移量。
下面是findcontours函數示例:
import cv2 import numpy as np img = cv2.imread("test.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, 0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0, 255, 0), 3) cv2.imshow("Contours", img) cv2.waitKey(0) cv2.destroyAllWindows()
上面的代碼首先載入一張圖片,將其轉換成灰度圖像,並使用閾值處理生成二值圖像。然後使用findcontours函數獲取圖像中所有物體的輪廓,並將其繪製在原圖上展示出來。
三、findcontours函數原理
findcontours函數的實現原理是通過掃描整張二值圖像,找到所有的輪廓,並將其存儲在一個輪廓的向量中。首先對輸入圖像進行二值化處理,然後使用指定的輪廓檢索模式和近似方法查找輪廓。在輪廓的查找過程中,使用的是逐像素比較法,從而確定圖像中每個像素的歸屬,最終得到所有輪廓的坐標。
在findcontours函數中,輪廓的檢索模式和近似方法是非常重要的參數。檢索模式決定了找到的輪廓的包含關係,具體而言,RETR_EXTERNAL模式只會返回最外面的輪廓,而RETR_TREE模式會返回所有的輪廓及其嵌套關係。近似方法則影響了輪廓的平滑度,CHAIN_APPROX_SIMPLE方法會忽略所有的不必要的點,從而得到平滑的輪廓。
四、findcontours函數應用
findcontours函數廣泛應用於計算機視覺和圖像處理領域,可以用於檢測圖像中的所有物體、計算物體的周長和面積、提取物體的邊緣信息等。下面是一些findcontours函數的應用案例。
1、輪廓匹配
輪廓匹配是一種利用輪廓形狀進行物體識別和匹配的方法。可以使用findcontours函數提取物體輪廓,並使用matchShapes函數計算兩個輪廓間的相似度。下面是一個輪廓匹配的示例:
import cv2 import numpy as np template = cv2.imread('template.jpg',0) target = cv2.imread('target.jpg',0) ret, thresh1 = cv2.threshold(template, 127, 255, 0) ret, thresh2 = cv2.threshold(target, 127, 255, 0) contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contour1 = contours[0] contours, hierarchy = cv2.findContours(thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contour2 = contours[0] ret = cv2.matchShapes(contour1, contour2, 1, 0.0) print(ret)
2、形態學操作
形態學操作是指對圖像進行形狀變換的處理方法,包括腐蝕、膨脹、開運算、閉運算等。可以使用findcontours函數提取物體輪廓,並將輪廓和形態學操作相結合,實現特定目的。下面是一個形態學操作的示例:
import cv2 import numpy as np img = cv2.imread('test.jpg', 0) ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) kernel = np.ones((5,5), np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) contours, hierarchy = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0, 255, 0), 2) cv2.imshow('Contours', img) cv2.waitKey(0) cv2.destroyAllWindows()
3、邊緣檢測
邊緣檢測是指檢測圖像中明暗變化的方法,包括Sobel運算元、Canny運算元等。可以使用findcontours函數提取物體輪廓,並將輪廓和邊緣檢測相結合,增強圖像的邊緣信息。下面是一個邊緣檢測的示例:
import cv2 import numpy as np img = cv2.imread('test.jpg',0) edges = cv2.Canny(img, 100, 200) contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0, 255, 0), 2) cv2.imshow('Contours', img) cv2.waitKey(0) cv2.destroyAllWindows()
五、總結
findcontours函數是OpenCV中處理輪廓的重要函數之一,可以用於找到二值圖像中所有物體的輪廓。在使用findcontours函數時,需要重點考慮輪廓的檢索模式和近似方法,以達到最佳的輪廓檢測效果。通過相應的應用案例,我們可以更直觀地了解findcontours函數的實現原理和使用方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231822.html