OpenCV半小時(shí)掌握基本操作之圓圈檢測(cè)
【OpenCV】⚠️高手勿入! 半小時(shí)學(xué)會(huì)基本操作 ⚠️ 圓圈檢測(cè)
概述
OpenCV 是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫, 支持多語言, 功能強(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)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。