目录:
- 1.什么是霍夫变换?
- 2.OpenCV中的霍夫线变换-->直线检测
- 3.OpenCV中的霍夫圆变换-->圆检测
一、什么是霍夫变换?
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲。
霍夫变换将图像空间转变为参数空间,在参数空间中执行投票来决定物体的形状。
二、OpenCV中的霍夫线变换
OpenCV中的霍夫线变换步骤:
1.轮廓检测算法检测出轮廓
2.投射到Hough空间进行形状检测
1)直线检测
lines = cv2.HoughLines(image, rho, theta, threshold)
参数:
image: 单通道的二进制图像
rho: (ρ,θ)中ρ的精度。
theta: (ρ,θ)中θ的精度。
threshold: 阈值,(ρ,θ)对应的最低投票数。>=threshold被检测为一条线。
2)圆检测
circles = cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
参数:
method:定义检测图像中圆的方法。目前唯一实现的方法是HOUGH_GRADIENT。
dp:累加器分辨率与图像分辨率的反比。
dp=1,则累加器与输入图像具有相同的分辨率;dp=2,累加器有一半的宽度和高度。
minDist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
param1 :用于Canny的边缘阀值上限,下限被置为上限的一半。
param2:HOUGH_GRADIENT方法的累加器阈值(最低投票数)。阈值越小,检测到的圈子越多。
minRadius :最小圆半径。
maxRadius:最大圆半径。
1)直线检测
一条线可以表示为y=mx+c或以参数形式表示为ρ=xcosθ+ysinθ,其中ρ是从原点到该线的垂直距离,而θ是由该垂直线和水平轴形成的角度以逆时针方向测量(该方向随您如何表示坐标系而变化。此表示形式在OpenCV中使用)。查看下面的图片:

因此,如果线在原点下方通过,则它将具有正的ρ且角度小于180。如果线在原点上方,则将角度取为小于180,而不是大于180的角度。ρ取负值。任何垂直线将具有0度,水平线将具有90度。
示例:
# 1.直线检测
import cv2
import numpy
img = cv2.imread("image/2.jpg")
# 1.轮廓检测算法检测出轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# 2.投射到Hough空间进行形状检测
# 任何一条线都可以用(ρ,θ)这两个术语表示。
# 1)先定义一个累加器,(ρ,θ)对应直线,ρ和θ都分别依次增大(根据精度),计算每对(ρ,θ)的投票数。
# 其中,ρ以像素为单位,θ以弧度为单位。rho和theta是ρ和θ的精度。
# 2)然后,根据threshold(阈值,最低投票数)来判断是否归为一条直线
lines = cv2.HoughLines(edges, 1, numpy.pi / 180, 100)
# 画线
for line in lines:
rho, theta = line[0]
a = numpy.cos(theta)
b = numpy.sin(theta)
x0 = rho * a
y0 = rho * b
# k1*k2=-1 ==> k2=-1/k1
# k1 = tan(θ) ==> k2 = -1/tan(θ)=-cot(θ)
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * a)
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * a)
# 画线
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
cv2.imshow("img", img)
cv2.imshow("gray", gray)
cv2.imshow("edges", edges)
cv2.waitKey(0)
cv2.destroyWindow()
结果如下:

二、OpenCV中的霍夫圆变换
2)圆检测
示例:
# 2.圆检测
import cv2
import numpy
img = cv2.imread("image/59.png")
# 1.轮廓检测算法检测出轮廓
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 100)
# 2.投射到Hough空间进行形状检测
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 30, param1=40, param2=20, minRadius=5, maxRadius=100)
# 画圆
if not circles is None:
# 转换为int
circles = numpy.uint16(numpy.around(circles))
for circle in circles:
x, y, r = circle[0]
# 画圆
cv2.circle(img, (x, y), r, (0, 0, 255), 2)
cv2.imshow("gray", gray)
cv2.imshow("edges", edges)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyWindow()
结果如下:

网友评论