霍夫直线变换

2022-05-28 16:31:15 浏览数 (2)

代码语言:javascript复制
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#原始图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将彩色图片转换为灰度图片
edges=cv2.Canny(gray,50,150,apertureSize=3)#Canny算子
orgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
oShow=orgb.copy()
lines=cv2.HoughLines(edges,1,np.pi/180,140)#霍夫直线变换
for line in lines:
    rho,theta=line[0]
    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(orgb,(x1,y1),(x2,y2),(0,0,255),2)#绘制霍夫直线变换
plt.subplot(121)
plt.imshow(oShow)
plt.axis('off')
plt.subplot(122)
plt.imshow(orgb)
plt.axis('off')

算法:霍夫直线变换是选择由尽可能多条线汇成的点。当霍夫坐标系内交于某点的曲线达到了阈值,即在对应的极坐标系内存在(检测到)一条直线。在霍夫坐标系中,横坐标采用笛卡儿坐标系中直线的斜率k,纵坐标使用笛卡儿坐标系中直线的截距b。笛卡儿空间内的6个点映射到霍夫空间内:

6个点的空间对应关系:

笛卡儿空间内的6个点简化后的连线关系:

LineA:(0,1)、(1,2)、(2,3)、(3,4)

LineB:(2,3)、(3,2)、(1,4)

LineC:(0,1)、(3,2)

极坐标系内,采用极径r(有时也用ρ表示)和极角θ来表示,即(r, θ)来表示。极坐标系中的直线可以表示为:

r=xcosθ ysinθ

lines=cv2.HoughLines(img, rho, theta, threshold)

  • img表示输入图像
  • rho表示以像素为单位的距离r的精度,通常设置为1
  • theta表示为角度θ的精度,通常设置为π/180
  • threshold表示阈值

注意:检测到的是图像中的直线不是线段,因此检测到的直线没有端点。

0 人点赞