代码语言: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表示阈值
注意:检测到的是图像中的直线不是线段,因此检测到的直线没有端点。