使用Python,OpenCV和Hough圆检测图像中的圆
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV和Hough圆检测图像中的圆
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
使用Python,OpenCV和Hough圓檢測(cè)圖像中的圓
- 1. 效果圖
- 2. cv2.HoughCircles(image, method, dp, minDist)
- 3. 源碼
- 參考
前幾篇博客中有介紹,使用OpenCV檢測(cè)圖形中的三角形、正方形、矩形,多邊形;這篇博客將展示如何利用cv2.HoughCircles函數(shù)使用OpenCV檢測(cè)圖像中的圓圈。
1. 效果圖
圓的檢測(cè)要比正方形、矩形的檢測(cè)要難,因?yàn)椴荒芎?jiǎn)單的根據(jù)輪廓的點(diǎn)數(shù)來確定圓;
簡(jiǎn)單圓的檢測(cè)
8個(gè)圓的檢測(cè),設(shè)置minDist:像素100,檢測(cè)的亂七八糟
8個(gè)圓的檢測(cè),設(shè)置minDist 像素75,發(fā)現(xiàn)有點(diǎn)問題,最大的圓并沒有檢測(cè)出來,因?yàn)樵O(shè)置的圓心之間的距離為75像素
2. cv2.HoughCircles(image, method, dp, minDist)
- image:8位單通道圖像。如果要處理彩色圖像,請(qǐng)先轉(zhuǎn)換為灰度。
- method:定義檢測(cè)圖像中圓圈的方法。當(dāng)前,唯一實(shí)現(xiàn)的方法是cv2.HOUGH_GRADIENT,
- dp:該參數(shù)是累加器分辨率與圖像分辨率的反比。本質(zhì)上,dp越大,累加器陣列越小。
- minDist:檢測(cè)到的圓的中心(x,y)坐標(biāo)之間的最小距離。如果minDist太小,則可能(錯(cuò)誤地)檢測(cè)到與原始對(duì)象相同鄰域中的多個(gè)圓圈。如果minDist太大,則可能根本檢測(cè)不到某些圓圈。
- param1:用于處理邊緣檢測(cè)的漸變值。
- param2:cv2.HOUGH_GRADIENT方法的累加器閾值。閾值越小,將檢測(cè)到更多的圓圈(包括假圓圈)。閾值越大,可能會(huì)返回更多的圈。
- minRadius:半徑的最小大小(以像素為單位)。
- maxRadius:半徑的最大大小(以像素為單位)。
在設(shè)置參數(shù)時(shí),正確設(shè)置minDist參數(shù)非常的重要。沒有最佳的minDist值,檢測(cè)最終會(huì)漏掉某些圓圈○,也可能檢測(cè)到許多錯(cuò)誤的圓圈。
3. 源碼
# USAGE
# python detect_circles.py --image images/simple.png# 導(dǎo)入必要的包
import argparseimport cv2
import numpy as np# 構(gòu)建命令行參數(shù)及解析
# --image 要檢測(cè)圓的圖像路徑
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())# 加載圖像,復(fù)制到output,并轉(zhuǎn)換為灰度圖
image = cv2.imread(args["image"])
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 在圖像上檢測(cè)圓
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100)# 確保有圓檢測(cè)到進(jìn)行后續(xù)操作
if circles is not None:# 將圓從浮點(diǎn)(x,y)坐標(biāo)轉(zhuǎn)換為整數(shù),從而可以在輸出圖像上繪制圓。circles = np.round(circles[0, :]).astype("int")# 遍歷圓的中心點(diǎn),及半徑for (x, y, r) in circles:# 在輸出圖像上繪制圓,并且在圓中心繪制一個(gè)矩形框cv2.circle(output, (x, y), r, (0, 255, 0), 4)cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)# 展示輸出圖像cv2.imshow("output", np.hstack([image, output]))cv2.waitKey(0)
參考
- https://www.pyimagesearch.com/2014/07/21/detecting-circles-images-using-opencv-hough-circles/
總結(jié)
以上是生活随笔為你收集整理的使用Python,OpenCV和Hough圆检测图像中的圆的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超声波探伤仪对人体有没有害?
- 下一篇: 图像分割:Python的SLIC超像素分