OpenCV半小時(shí)掌握基本操作之圓圈檢測(cè)
【OpenCV】⚠️高手勿入! 半小時(shí)學(xué)會(huì)基本操作 ⚠️ 圓圈檢測(cè)
概述
OpenCV 是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫(kù), 支持多語(yǔ)言, 功能強(qiáng)大. 今天小白就帶大家一起攜手走進(jìn) OpenCV 的世界.
霍夫圓變換
霍夫圓變換 (Hough Circle Transform) 的原理和霍夫直線變換類似. 對(duì)于一條直線, 我們可以用參數(shù) (r, θ) 表示, 對(duì)于圓我們需要三個(gè)參數(shù) (x, y, r), 分別代表三個(gè)參數(shù) x 圓心, y 圓心, r, 半徑.
代碼實(shí)現(xiàn)
因?yàn)榛舴驁A檢測(cè)對(duì)噪聲比較敏感, 所以首先要對(duì)圖像做中值濾波.
基于效率考慮, Opencv 中實(shí)現(xiàn)的霍夫變換圓檢測(cè)是基于圖像梯度實(shí)現(xiàn), 分為兩步:
檢測(cè)變換, 發(fā)現(xiàn)可能的圓心基于第一步的基礎(chǔ)上從候選圓心開始計(jì)算最佳半徑大小
格式:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
參數(shù):
image: 輸入圖像
method: 判別方法, 只有 HOUGH_GRADIENT (計(jì)算梯度) 一個(gè)方法
dp: 累計(jì)閾值
minDist: 間距, 小于間距判斷成一個(gè)圓
param1: Canny 邊緣檢測(cè)的最大閾值
param2: 在檢測(cè)階段圓心累加器閾值, 是否為圓形
例一
import numpy as np import cv2 from matplotlib import pyplot as plt # 讀取圖片 image = cv2.imread("map.jpg") image_copy = image.copy() # 均值遷移濾波 filter = cv2.pyrMeanShiftFiltering(image, 10, 100) # 轉(zhuǎn)換成灰度圖 filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY) # 霍夫曼圓圈檢測(cè) circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, minRadius=0, maxRadius=0) circles = np.uint16(np.around(circles)) # 遍歷 for circle in circles[0, :]: cv2.circle(image_copy, (circle[0], circle[1]), circle[2], (0, 0, 255), 2) cv2.circle(image_copy, (circle[0], circle[1]), 2, (255, 0, 0), 2) # 圖片展示 f, ax = plt.subplots(2, 2, figsize=(12, 12)) # 子圖 ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) ax[0, 1].imshow(cv2.cvtColor(filter, cv2.COLOR_BGR2RGB)) ax[1, 0].imshow(filter_gray, "gray") ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB)) # 標(biāo)題 ax[0, 0].set_title("original") ax[0, 1].set_title("image filter") ax[1, 0].set_title("image gray") ax[1, 1].set_title("image circle") plt.show() # 保存結(jié)果 cv2.imwrite("map_result.jpg", image_copy)
輸出結(jié)果:
例二
import numpy as np import cv2 from matplotlib import pyplot as plt # 讀取圖片 image = cv2.imread("coin.jpg") image_copy = image.copy() # 均值遷移濾波 filter = cv2.pyrMeanShiftFiltering(image, 10, 40) # 轉(zhuǎn)換成灰度圖 filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY) # 霍夫曼圓圈檢測(cè) circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, minRadius=0, maxRadius=0) circles = np.uint16(np.around(circles)) # 遍歷 for circle in circles[0, :]: cv2.circle(image_copy, (circle[0], circle[1]), circle[2], (0, 0, 255), 2) cv2.circle(image_copy, (circle[0], circle[1]), 2, (255, 0, 0), 2) # 圖片展示 f, ax = plt.subplots(2, 2, figsize=(12, 12)) # 子圖 ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) ax[0, 1].imshow(cv2.cvtColor(filter, cv2.COLOR_BGR2RGB)) ax[1, 0].imshow(filter_gray, "gray") ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB)) # 標(biāo)題 ax[0, 0].set_title("original") ax[0, 1].set_title("image filter") ax[1, 0].set_title("image gray") ax[1, 1].set_title("image circle") plt.show() # 保存結(jié)果 cv2.imwrite("coin_result.jpg", image_copy)
輸出結(jié)果:
到此這篇關(guān)于OpenCV半小時(shí)掌握基本操作之圓圈檢測(cè)的文章就介紹到這了,更多相關(guān)OpenCV圓圈檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中xmltodict對(duì)xml的操作方式
這篇文章主要介紹了Python中xmltodict對(duì)xml的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03如何將python中的List轉(zhuǎn)化成dictionary
這篇文章主要介紹在python中如何將list轉(zhuǎn)化成dictionary,通過提出兩個(gè)問題來告訴大家如何解決,有需要的可以參考借鑒。2016-08-08LyScript實(shí)現(xiàn)Hook隱藏調(diào)試器的方法詳解
LyScript?插件集成的內(nèi)置API函數(shù)可靈活的實(shí)現(xiàn)繞過各類反調(diào)試保護(hù)機(jī)制。本文將運(yùn)用LyScript實(shí)現(xiàn)繞過大多數(shù)通用調(diào)試機(jī)制,實(shí)現(xiàn)隱藏調(diào)試器的目的,需要的可以參考一下2022-09-09Python如何使用type()函數(shù)查看數(shù)據(jù)的類型
這篇文章主要介紹了Python如何使用type()函數(shù)查看數(shù)據(jù)的類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python代碼 FTP備份交換機(jī)配置腳本實(shí)例解析
這篇文章主要介紹了python代碼 FTP備份交換機(jī)配置腳本實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python打開文件、文件讀寫操作、with方式、文件常用函數(shù)實(shí)例分析
這篇文章主要介紹了Python打開文件、文件讀寫操作、with方式、文件常用函數(shù),結(jié)合實(shí)例形式分析了Python文件的打開、讀寫及常用文件操作函數(shù)使用技巧,需要的朋友可以參考下2020-01-01簡(jiǎn)單講解Python中的字符串與字符串的輸入輸出
這篇文章主要介紹了Python中的字符串與字符串的輸入輸出,Python3.x版本中默認(rèn)以Unicode為編碼,省去了不少麻煩,需要的朋友可以參考下2016-03-03