本文主要是介绍霍夫(Hough)直线变换(直线检测),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
检测步骤:
- 将参数空间(ρ,θ) 量化成m*n(m为ρ的等份数,n为θ的等份数)个单元,并设置累加器矩阵,初始值为0;
- 对图像边界上的每一个点(x,y)带入ρ=xcosθ+ysinθ,求得每个θ对应的ρ值,并在ρ和θ所对应的单元,将累加器加1;
- 检验参数空间中每个累加器的值,累加器最大的单元所对应的ρ和θ即为直角坐标系中直线方程的参数。
OpenCV中的霍夫变换:
cv2.HoughLines(image, rho, theta, threshold, lines, sen, stn, min_theta, max_theta)
image:输入图像,8-bit灰度图像
rho:生成极坐标时候的像素扫描步长
theta:生成极坐标时候的角度步长
threshold:阈值,只有获得足够交点的极坐标点才被看成是直线
lines:返回值,极坐标表示的直线(ρ, θ)
sen:是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
stn:是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
min_theta:表示角度扫描范围最小值
max_theta:表示角度扫描范围最大值
cv2.HoughLinesP(image, rho, theta, threshold, lines, minLineLength, maxLineGap)
src:输入图像,必须8-bit的灰度图像
rho:生成极坐标时候的像素扫描步长
theta:生成极坐标时候的角度步长
threshold:阈值,只有获得足够交点的极坐标点才被看成是直线
lines:输出的极坐标来表示直线
minLineLength:最小直线长度,比这个短的线都会被忽略。
maxLineGap:最大间隔,如果小于此值,这两条直线 就被看成是一条直线。
Python实现:
import cv2
import numpy as npimg = cv2.imread('building.jpg')
img1 = img.copy()
img2 = img.copy()
img = cv2.GaussianBlur(img, (3, 3), 0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 200, apertureSize=3)# 1.HoughLines方法
lines = cv2.HoughLines(edges, 1, np.pi / 180, 150)for line in lines:rho = line[0][0]theta = line[0][1]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(img1, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imshow('HoughLines', img1)# 2.HoughLinesP方法
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 80, minLineLength=30, maxLineGap=10)for line in lines:x1 = line[0][0]y1 = line[0][1]x2 = line[0][2]y2 = line[0][3]cv2.line(img2, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imshow('HoughLinesP', img2)
cv2.waitKey()
cv2.destroyAllWindows()
实现结果:
这篇关于霍夫(Hough)直线变换(直线检测)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!