直线检测
cv2.HoughLinesP()函数原型:

HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) 
  1. image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
  2. rho:线段以像素为单位的距离精度,double类型的,推荐用1.0
  3. theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
  4. threshod:累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
  5. lines:线条的输出向量。
  6. minLineLength:线段以像素为单位的最小长度。
  7. maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
import cv2
import numpy as np
img = cv2.imread('lines.jpg')
# 灰度处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# canny边缘处理
edges = cv2.Canny(gray,50,120)
line = 100
minLineLength = 20
# HoughLinesP函数是概率直线检测,注意区分HoughLines函数
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, lines=line, minLineLength=minLineLength)
# 降维处理
lines1 = lines[:,0,:]
# line 函数勾画直线
# (x1,y1),(x2,y2)坐标位置
# (0,255,0)设置BGR通道颜色
# 2 是设置颜色粗浅度
for x1,y1,x2,y2 in lines1:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
# 显示图像
cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()

原图
这里写图片描述
效果图
这里写图片描述

直线的识别与HoughLinesP函数参数的设置有关

圆检测
HoughCircles函数原型

cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

参数说明:

  1. image- 8位,单通道,灰度输入图像。 method- 使用检测方法。
  2. dp - 累加器分辨率与图像分辨率的反比。例如,如果 dp= 1,则累加器具有与输入图像相同的分辨率。如果 dp = 2,则累加器的宽度和高度都是一半。
  3. minDist -检测到的圆的中心之间的最小距离。如果参数太小,除了真正的参数外,可能会错误地检测到多个邻居圈。如果太大,可能会错过一些圈子。
  4. circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径)。
  5. param1 -第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下,
    两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍)
  6. param2 -第二种方法参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。
  7. minRadius -最小圆半径。
import cv2
import numpy as np
planets = cv2.imread('planet_glow.jpg')
# 灰度处理
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
# medianBlur 平滑(模糊)处理
img = cv2.medianBlur(gray_img, 5)
# 灰度图像转彩色图像
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
# 圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=50, maxRadius=100)
# 转化整数
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # 勾画圆形,planets图像、(i[0],i[1])圆心坐标,i[2]是半径
    cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
    # 勾画圆心,圆心实质也是一个半径为2的圆形
    cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# 显示图像
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("mypic", cimg)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()

原图
这里写图片描述
效果图
这里写图片描述
圆的识别与HoughCircles函数参数的设置有关

注意:
这里写图片描述
例子可参考:Python 使用Opencv实现边缘检测以及轮廓检测的示例二

参考资料:OpenCV 3计算机视觉 Python语言实现第二版

欢迎加入学习交流QQ群:657341423直线检测 cv2.HoughLinesP()函数原型:HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) image: 必须是二值图像,推荐使用canny边缘检测的结果图像; rho:线段以像素为单...
霍夫检测对噪声比较敏感,所有进行霍夫检测的时候要先进行中值滤波。 在OpenCV中是通过图像梯度来实现霍夫变换检测的,因此要选用cv2.HOUGH_GRADIENT这个参数。 其实现分为两步: 检测图像边缘,发现可能的心 从候选心中计算最佳半径大小 import cv2 import numpy as np smarties = cv2.imread(r"F:\Python\pict...
内容来自OpenCV-Python Tutorials 自己翻译整理目标:使用霍夫变换在图像中寻找 使用函数cv2.HoughCircles()原理:圆形的表达式为(x−xcenter)2+(y−ycenter)2=r2(x-x_{center})^2+(y-y_{center})^2=r^2,一个环的确定需要三个参数。那么霍夫变换的累加器必须是三维的,但是这样的计算效率很低。 这里open
如何检测一个在多个内? Circle Detection using OpenCV | Python OpenCV #010 Circle Detection Using Hough Transform Detecting overlapping circles OpenCV Coin Detection Project Counting blue and white bacteria colonies with Python and OpenC