基本思路

图像里的一条直线通常由许多边缘点组成。霍夫变换会让每个边缘点去给可能经过它的直线参数投票。如果一组参数得到的票数很多,就说明原图里可能有这条直线。OpenCV 里常用 rhotheta 表示直线。

实验流程

  • 读取图像并转换为灰度图,减少后续计算量。
  • 使用 cv2.Canny 提取边缘,得到二值边缘图。
  • 调用 cv2.HoughLines,设置距离分辨率、角度分辨率和投票阈值。
  • 遍历检测到的直线参数,根据三角函数换算出图像中的两个端点。
  • 使用 cv2.line 将检测到的直线绘制回原图。
霍夫变换直线检测输入图
霍夫直线检测实验使用的输入图。

参数影响

Canny 阈值决定边缘图的干净程度,霍夫阈值决定直线检测的严格程度。边缘太少会漏检,边缘太碎会产生噪声投票;阈值太高只保留最强直线,阈值太低则可能画出许多无意义线段。

Canny 边缘和霍夫直线检测结果
左侧是 Canny 边缘,右侧是在原图上画出的直线检测结果。

我的思考

霍夫变换虽然是比较传统的方法,但用起来很直观。不需要训练数据,只要目标边缘比较清楚,就能检测出直线。道路标线、零件边缘、表格线这类规则结构,都可以先考虑这种方法。

它的问题也明显。边缘图质量差时,检测结果会跟着变差;复杂纹理多时,也容易出现误检。标准霍夫变换画出来的是延长后的直线,不一定就是图像里的真实线段。后面如果要做得更细,可以试试概率霍夫变换,再加上长度和方向过滤。