OpenCV曲線擬合與圓擬合
阿新 • • 發佈:2018-06-12
圖像分析 曲線擬合 OpenCV Python 圖像處理 OpenCV曲線擬合與圓擬合
使用OpenCV做圖像處理與分析的時候,經常會遇到需要進行曲線擬合與圓擬合的場景,很多OpenCV開發者對此卻是一籌莫展,其實OpenCV中是有現成的函數來實現圓擬合與直線擬合的,而且還會告訴你擬合的圓的半徑是多少,簡直是超級方便,另外一個常用到的場景就是曲線擬合,常見的是基於多項式擬合,可以根據設定的多項式冪次生成多項式方程,然後根據方程進行一系列的點生成,形成完整的曲線,這個車道線檢測,輪廓曲線擬合等場景下特別有用。下面就通過兩個簡單的例子來分別學習一下曲線擬合與圓擬合的應用。
一:曲線擬合與應用
基於Numpy包的polyfit函數實現,其支持的三個參數分別是x點集合、y點集合,以及多項式的冪次。得到多項式方程以後,就可以完整擬合曲線,圖中有如下四個點:
調用polyfit生成的二階多項式如下:
擬合結果如下:
使用三階多項式擬合,調用polyfit生成的多項式方程如下:
生成的擬合曲線如下:
使用polyfit進行曲線擬合時候需要註意的是,多項式的冪次最大是數據點數目N - 1冪次多項式,比如有4個點,最多生成3階多項式擬合。上述演示的完整代碼實現如下:
def circle_fitness_demo(): image = np.zeros((400, 400, 3), dtype=np.uint8) x = np.array([30, 50, 100, 120]) y = np.array([100, 150, 240, 200]) for i in range(len(x)): cv.circle(image, (x[i], y[i]), 3, (255, 0, 0), -1, 8, 0) cv.imwrite("D:/curve.png", image) poly = np.poly1d(np.polyfit(x, y, 3)) print(poly) for t in range(30, 250, 1): y_ = np.int(poly(t)) cv.circle(image, (t, y_), 1, (0, 0, 255), 1, 8, 0) cv.imshow("fit curve", image) cv.imwrite("D:/fitcurve.png", image)
二:圓擬合與應用
圓的擬合是基於輪廓發現的結果,對發現的近似圓的輪廓,通過圓擬合可以得到比較好的顯示效果,輪廓發現與擬合的API分別為findContours與fitEllipse,
有圖像如下:
使用輪廓發現與圓擬合處理結果如下:
紅色表示擬合的圓,藍色是圓的中心位置
上述完整的演示代碼如下:
def circle_fitness_demo(): src = cv.imread("D:/javaopencv/c2.png") cv.imshow("input", src) src = cv.GaussianBlur(src, (3, 3), 0) gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) cv.imshow("binary", binary) image, contours, hierachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): rrt = cv.fitEllipse(contours[i]) cv.ellipse(src, rrt, (0, 0, 255), 2, cv.LINE_AA) x, y = rrt[0] cv.circle(src, (np.int(x), np.int(y)), 4, (255, 0, 0), -1, 8, 0) cv.imshow("fit circle", src) cv.imwrite("D:/fitcircle.png", src)
學習OpenCV Python 系列課程
OpenCV Python零基礎入門視頻教程
OpenCV Python圖像處理進階視頻教程
吾心信其可行,則移山填海之難,終有成功之日;
吾心信其不可行,則反掌折枝之易,亦無收效之期也
OpenCV曲線擬合與圓擬合