参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。



# 霍夫变换用于在图像中查找直线和圆等形状;
# 1.霍夫直线变换
# 语法格式:lines = cv2.HoughLines(image, rho, theta, threshold)
# 参数说明:
# a.lines:返回的直线;
# b.image:原图像,必须是8位单通道二值图像;
# c.rho:距离的精度,以像素为单位,通常为1;
# d.theta:角度的精度,通常以Π/180°,表示搜索所有可能的角度;
# e.threshold:阈值,阈值越小,检测出的直线越多;
import cv2 as cv
import numpy as np

img1 = cv.imread("lanelines.JPG")
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 125, 150, apertureSize = 3)
lines = cv.HoughLines(edges, 1, np.pi / 180, 90)
img3 = img1.copy()

for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0, y0 = a * rho, b * rho
    pt1 = (int(x0 + 1000 * (-b)), int(y0 + 1000 * (a)))
    pt2 = (int(x0 - 1000 * (-b)), int(y0 - 1000 * (a)))
    cv.line(img3, pt1, pt2, (0, 0, 255), 2)

cv.imshow("initial", img1)
cv.imshow("edges", edges)
cv.imshow("houghlines", img3)
cv.waitKey(0)

1

# 2.概率霍夫变换
# 语法格式:lines = cv2.HoughLinesP(image, rho, theta, threshold[, minLineLength[, maxLineGap]])
# 参数说明:
# a.lines:返回的直线;
# b.image:原图像,必须是8位单通道二值图像;
# c.rho:距离的精度,以像素为单位,通常为1;
# d.theta:角度的精度,通常以Π/180°,表示搜索所有可能的角度;
# e.threshold:阈值,阈值越小,检测出的直线越多;
# f.minLineLength:可接受的直线的最小长度,默认值为0;
# g.maxLineGap:共线线段之间的最大间隔,默认值为0;
import cv2 as cv
import numpy as np

img1 = cv.imread("lanelines.JPG")
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 200, 300, apertureSize = 3)
#lines = cv.HoughLinesP(edges, 1, np.pi / 180, 10, minLineLength = 100, maxLineGap = 10)
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 1)

img3 = img1.copy()
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv.line(img3, (x1, y1), (x2, y2), (0, 0, 255), 2)
    
cv.imshow("initial", img1)
cv.imshow("edges", edges)
cv.imshow("houghLines", img3)
cv.waitKey(0)

2

# 3.霍夫圆变换
# 语法格式:circles = cv2.HoughCircles(image, method, dp, minDist[, param1[, param2[, minRadius[, maxRadius]]]])
# 参数说明:
# a.circles:返回的圆;
# b.image:原图像;
# c.method:查找方法,可设置:cv2.HOUGH_GRADIENT、cv2.HOUGH_GRADIENT_ALT;
# d.dp:累加器分辨率,与图像分辨率成反比;如果dp = 1,则累加器与输入图像的分辨率相同;如果dp = 2,则累加器的宽度和高度为输入图像的一半;
# e.minDist:圆心间的最小距离;
# f.param1:对应Canny边缘检测的高阈值,默认值为100;
# g.param2:圆心位置必须达到的投票数,值越大,检测出来的圆越少,默认值为100;
# h.minRadius:最小圆半径,半径小于该值的圆不会被检测出来;默认值:0,此时不起作用;
# i.maxRadius:最大圆半径,半径大于该值的圆不会被检测出来;默认值:0,此时不起作用;
import cv2 as cv
import numpy as np

img1 = cv.imread("egg2.JPG")
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 200, 300, apertureSize = 3)
circles = cv.HoughCircles(edges, cv.HOUGH_GRADIENT, 1, 50, param2 = 20, minRadius = 100, maxRadius = 200)
circles = np.uint16(np.around(circles))
img2 = img1.copy()

for i in circles[0,:]:
    cv.circle(img2, (i[0], i[1]), i[2], (255, 0, 0), 2)    # 画圆
    cv.circle(img2, (i[0], i[1]), 2, (0, 0, 255), 3)       # 画圆心
cv.imshow("initial", img1)
cv.imshow("edges", edges)
cv.imshow("circles", img2)
cv.waitKey(0)

3

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐