Open CV系列学习笔记(十七)圆检测 2021-02-12

Open CV系列学习笔记(十七)圆检测

霍夫变换

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
现在广泛使用的霍夫变换是由RichardDuda和PeterHart在公元1972年发明,并称之为广义霍夫变换(generalizedHoughtransform),广义霍夫变换和更早前1962年的PaulHough的专利有关。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能识别直线,也能够识别任何形状,常见的有圆形、椭圆形。1981年,因为DanaH.Ballard的一篇期刊论文"Generalizing the Hough transform to detect arbitrary shapes",让霍夫变换开始流行于计算机视觉界。
Open CV系列学习笔记(十七)圆检测 2021-02-12_第1张图片
Open CV系列学习笔记(十七)圆检测 2021-02-12_第2张图片

霍夫圆变换原理

从平面坐标到极坐标转换三个参数,C(x0, y0,r)其中x0, y0是圆心。
假设平面坐标的任意一个圆上的点,转换到极坐标中:C(x0, y0,r),处有最大值,霍夫变换正是利用这个原理实现圆的检测。
因为霍夫圆检测对噪声比较敏感,所以首先要对图
像做中值滤波。
基于效率考虑, Opencv中实现的霍夫变换圆检测
是基于图像梯度的实现,分为两步:

  1. 检测边缘,发现可能的圆心
  2. 基于第一步的基础上从候选圆心开始计算最佳半
    径大小
    代码:
def detect_circle_demo(image):#霍夫圆检测
    dst = cv.pyrMeanShiftFiltering(image,10,140)
    cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY)
    circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
        cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
        cv.imshow("circles",image)

结果:
Open CV系列学习笔记(十七)圆检测 2021-02-12_第3张图片

完整代码:

import cv2 as cv
import numpy as np


def detect_circle_demo(image):#霍夫圆检测
    dst = cv.pyrMeanShiftFiltering(image,10,95)
    cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY)
    circles = cv.HoughCircles(cimage,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
        cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
        cv.imshow("circles",image)


print("--------HEllow Python-------")
src = cv.imread("E:\picture/34.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
detect_circle_demo(src)
cv.waitKey(0)


cv.destroyAllWindows()

你可能感兴趣的:(opencv学习笔记系列,算法,opencv,计算机视觉,图像识别)