1.1 霍夫变换(Hough Transform)
霍夫变换(Hough Transform)换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理中从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。
霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
1.2 霍夫直线检测(Hough Line Detection)
Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:
1)图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
2)图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。
因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。
直线检测进入霍尔直线检测空间
1.3 代码实现
import cv2 as cv import numpy as np #霍尔直线检测HoughLines def line_image(image): tmp_image=image.copy() gray = cv.cvtColor(tmp_image, cv.COLOR_BGR2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # 提取图像中所有的直线 如果没有侧键到返回lines=nonetype ''' 霍夫直线(极坐标空间):边缘检测图片edges,半径步长1,角度增量np.pi/180,边缘提取的低值200. ''' lines = cv.HoughLines(edges, 1, np.pi/180, 200) 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)) #在原图绘制直线(x1,y1)--->(x2,y2) 颜色:红色 像素:2px cv.line(tmp_image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv.imshow('line',tmp_image) #霍尔直线检测HoughLinesP(推荐使用) def linep_image(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # 提取图像中所有的直线 如果没有侧键到返回lines=nonetype ''' 霍夫直线(极坐标空间):边缘检测图片edges,半径步长1,角度增量np.pi/180,边缘提取的低值200.最先直线的长度100px,直线中途允许有50px非直线 ''' lines = cv.HoughLinesP(edges, 1, np.pi/180, 100,minLineLength=100,maxLineGap=50) for line in lines: x1,y1,x2,y2=line[0] #在原图绘制直线(x1,y1)--->(x2,y2) 颜色:红色 像素:2px cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv.imshow('linep',image) src = cv.imread("wangge.png") cv.imshow("原来", src) line_image(src) linep_image(src) cv.waitKey(0) cv.destroyAllWindows()
效果展示
相同代码进行倾斜直线检测