霍夫(Hough)直线变换(直线检测)

检测步骤: 

  1.  将参数空间(ρ,θ) 量化成m*n(m为ρ的等份数,n为θ的等份数)个单元,并设置累加器矩阵,初始值为0;
  2.  对图像边界上的每一个点(x,y)带入ρ=xcosθ+ysinθ,求得每个θ对应的ρ值,并在ρ和θ所对应的单元,将累加器加1;
  3.  检验参数空间中每个累加器的值,累加器最大的单元所对应的ρ和θ即为直角坐标系中直线方程的参数。

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 np

img = 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 * rho
    y0 = b * rho
    x1 = 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()

实现结果:

发布了45 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_32857543/article/details/103093242