OpenCV--Hough变换

检测图像中的线条时经常会使用到Hough变换

一条直线以参数形式将其表示为
在这里插入图片描述
在这里插入图片描述
表示原点到该直线的垂直距离

在这里插入图片描述
表示该直线的垂线和水平轴形成的角度(以逆时针方向为正,反之为负)

在这里插入图片描述
Hough变换原理涉及到 image space 和 Hough space 的相互转换
image space 中image space 中的点表现为Hough space 中的一条正弦曲线,image space 中的一条直线映射到 Hough space 中就是多条正弦曲线的交点,交点的坐标即 image space 中直线的参数。鉴于此,可以先用Canny边缘检测器得到图像的轮廓,再用Hough变换提取Canny检测结果中的直线。

概率霍夫变换是霍夫变换的优化,它没有考虑所有要点,而仅采用随机的点的子集,不过必须降低阈值以此增加采样点的数目。

cv2.HoughLinesP(image, rho, theta, threshold, np.array([]), min_line_length=None, max_line_gap=None)

参数说明:
img:二进制图像,一般为Canny边缘检测之后的图像。
rho:ρ的精度,一般为一个像素。
theta:θ的精度, 一般设置为一弧度。
threshold:阈值,这意味着Hough space 中判断是否为一个交点的最低投票数。
np.array([]): a placeholder,无需改变
min_line_length:小于此长度的线段将被忽略掉。
maxLineGap:线段之间允许将它们视为一条线的最大间隙,大于此间隙将被视为两条直线。

import numpy as np
import cv2

def cv2_show(win_name, img_name):
    cv2.imshow(win_name, img_name)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

image = cv2.imread('E:\\opencv\\lane.png')

gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)

low_threshold = 50
high_threshold = 150
Canny_image = cv2.Canny(blur_gray, low_threshold, high_threshold)

rho = 1
theta = np.pi/180
threshold = 1
min_line_length = 10
max_line_gap = 1
line_image = np.copy(image)*0  #创造一个和image等大的黑色画板

lines = cv2.HoughLinesP(Canny_image, rho, theta, threshold, np.array([]),
                            min_line_length, max_line_gap)
#lines [b,1,(x1,y1,x2,y2)]  (x1,y1)、(x2,y2) 为直线的两个端点坐标
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)
cv2_show('line_image', line_image)

#Canny_image 变为 3个通道
color_Canny_image = np.dstack((Canny_image, Canny_image, Canny_image))

#融合Canny_image & line_image
combo = cv2.addWeighted(color_Canny_image, 0.8, line_image, 1, 0)
cv2_show('combo', combo)
result = np.hstack((gray, blur_gray, Canny_image))
cv2_show('result', result)

cv2.imwrite('E:\\opencv\\result.jpg', result)
cv2.imwrite('E:\\opencv\\combo.jpg', combo)

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46278903/article/details/106569024