hough变换
原型
cv2.HoughLines()
dst: 输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对 (r,\theta) 的容器
rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 设置阈值: 一条直线所需最少的的曲线交点
srn and stn: 参数默认为0
cv2.HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 )
dst: 输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器
rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 设置阈值: 一条直线所需最少的的曲线交点。超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。
minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的两点的最大距离。
代码
import cv2
import numpy as np
img = cv2.imread('./image/timg.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像
blur = cv2.GaussianBlur(img_gray, (3, 3), 0) # 高斯滤波
edges = cv2.Canny(blur, 50, 150) # canny算子处理图片
#hough transform
# 调节参数: 线最少点数 + 线最大点间隔
lines = cv2.HoughLinesP(edges, 1, np.pi/180,30, minLineLength=20, maxLineGap=5)
lines1 = lines[:,0,:]#提取为二维
for x1,y1,x2,y2 in lines1[:]:
cv2.line(img, (x1,y1), (x2,y2), (0,0,255),2) # 画线
cv2.imshow('canny_process', edges)
cv2.imshow('hough_image', img)
cv2.imwrite('./image/hough_image.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
主要调节参数minilineLength、maxLinGaP
结果
原图:
hough变换直线检测: