原理链接如下:陌归:霍夫(Hough)变换之直线检测

代码链接:Ganso:Fundamentals——从车道线检测谈到霍夫变换

同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理。

霍夫变换的由来

“霍夫变换于1962年由Paul Hough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。后于1972年由Richard Duda & Peter Hart推广使用。”

其实,霍夫变换的中心思想就是通过坐标变换来检测直线,后来经过改进,就可以检测椭圆等。

霍夫线变换

坐标系的角度:

说起直线,我们会想到笛卡尔坐标系(即x-y坐标系)下的直线方程,细分之则有点斜式、截距式等,

是我们最熟悉的一种。但直线垂直于x轴时斜率
不存在,这给我们带来许多不便之处。

这时极坐标就carry全场了,它与笛卡尔坐标系的转换关系:

,变形可得
为原点到直线的距离,也常用
表示,示意图如下:

由此极坐标下,直线可用

表示。这就启发我们,同一直线上的点具有相同的
x-y坐标系下的一个点在rho-theta坐标系下为正弦曲线
同一直线上的点会有相同的rho和theta,即在rho-theta下交于一点

统计学的角度:

内容出自:Opencv学习笔记-----霍夫变换直线检测及原理理解 - CSDN博客

如上图,假定在一个8*8的平面像素中有一条直线,并且从左上角

像素点开始分别计算
为0°、45°、90°、135°、180°时的
,图中可以看出
分别为
,并给这5个值分别记一票,同理计算像素点
为0°、45°、90°、135°、180°时的
,再给计算出来的5个
值分别记一票,此时就会发现
的这个值已经记了两票了,以此类推,遍历完整个8*8的像素空间的时候
就记了5票, 别的
值的票数均小于5票,所以得到该直线在这个8*8的像素坐标中的极坐标方程为
,到此该直线方程就求出来了。

霍夫圆变换

霍夫圆变换使用的算法叫霍夫梯度法,对应的函数为HoughCircles,这个函数实际上是对常规找圆算法的一种改进,这里不展开讲,想学习这个原理的同学请参考找圆算法((HoughCircles)总结与优化 - CSDN博客

1. base

导入必要的包,顺便写一个打印图像的函数,cv2与plt颜色通道不一致(所以为什么不用plt导入呢)。

import numpy as np
import matplotlib.pyplot as plt
import cv2# opencv的颜色通道顺序为[B,G,R],而matplotlib的颜色通道顺序为[R,G,B]。
def plotImg(img):if len(img.shape)==3:img = img[:,:,(2,1,0)]plt.imshow(img)else:plt.imshow(img, cmap='gray')plt.show()

导入图片,感觉如果干扰很多效果也不会太好。

image = cv2.imread('test_image.jpg')
plotImg(image)

canny

灰度,模糊,canny三连击。
canny输入需求如此。

def canny(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blur = cv2.GaussianBlur(gray,(5,5),0)canny = cv2.Canny(blur, 50, 150)return cannylane_image = np.copy(image)
canny = canny(lane_image)
plotImg(canny)

region_of_interest

手工特征区域?作者的思路也是蛮清奇的。
简单来说就是对于视角前面的三角形区域做了一个mask,全部填充255,与原图像bitwise。

def region_of_interest(image):height = image.shape[0]polygons = np.array([[(200,height), (1100,height), (550,250)]])mask = np.zeros_like(image)cv2.fillPoly(mask, polygons, 255)masked_image= cv2.bitwise_and(image,mask)return masked_imagecropped_image = region_of_interest(canny)
plotImg(cropped_image)


2. Hough Transform

将图像提取边缘之后获得了很多杂乱的点,而我们需要做的就是找到过这些点的公共直线。

点斜式方程

点斜式方程是

,那么对于经过下图黑色点的直线簇,我们可以将其映射到一个以m,b位坐标的空间,b是m的线性函数。对于不同的两个点,我们可以将其直线簇映射到mb空间的两个直线上,而mb空间两个直线的交点(m,b)就是这两个点公共直线的参数。但是这样还是存在问题的,当直线是垂直的时候,m趋向于无穷,不好表示,我们需要另外一种映射。

极坐标方程

在极坐标空间中,对于过固定点的直线,过原点做垂线,记距离为

,夹角为
,通过图示我们可以得到对于过一点x,y的直线簇有:

也就是说过固定点的直线簇

之间有一定的函数关系。

霍夫变换

我们将过每个点的直线簇映射到极坐标空间,基本都由一条曲线表示,比如图示的三个点,这样。曲线的交点对应的坐标就是过所有点的直线的极坐标参数。

投票机制

当图片上的点非常多时,所有曲线并不期望相交于一点。我们可以将霍夫空间划分为一个个patch,当一个patch上面的交点满足大于某个threshold时,我们视为这些点有它们的公共直线。

3. cv2实现

cv.2HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

参数
image 图像。
rho、theta:分辨率。(分别率就是指同一个角度,如果计算出两点的rio值小于2,则认为是同一直线。)
threshold:投票阈值。
lines:没有查到。
minLineLength:最小线条长度。
maxLineGap:最大线条间隔。

def display_lines(image,lines):line_image = np.zeros_like(image)if lines is not None:for line in lines:x1, y1, x2, y2 = line.reshape(4)cv2.line(line_image, (x1,y1), (x2,y2),(255,0,0),10)return line_imagelines = cv2.HoughLinesP(cropped_image, 2, np.pi/180, 100, np.array([133,2]), minLineLength=40, maxLineGap=5)
line_image = display_lines(image,lines)
plotImg(line_image)combo_image = cv2.addWeighted(lane_image,0.8, line_image,1,1)
plotImg(combo_image)

霍夫变换求直线

hough变换检测圆周_hough变换原理以及实现(转载)相关推荐

  1. hough变换检测圆周_用点Hough变换实现圆检测的方法

    图像中圆的检测及其参数确定是计算机视觉和模式识 别中一项重要任务.常用的圆检测技术有形状分析法.环路积分微分法[1].圆变换()HoughCHT [2]等.是目前应用CHT 最为广泛的圆检测方法,该方 ...

  2. hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)

    引言 本文讲述霍夫变换的一些内容,并加入一些理解性东西,参考了部分博客等相关性内容.希望能对霍夫变换有所了解,也希望看到的人如果发现错误及时帮忙纠正.博主水平有限,还望赐教. 历史和简介 历史 霍夫变 ...

  3. hough变换检测圆周_【视觉】视觉检测人应该了解的缺陷检测方法

    本文参考并摘引:李少波, 杨静, 王铮, 朱书德, 杨观赐. 缺陷检测技术的发展与应用研究综述. 自动化学报, 2020, 46(11): 2319−2336. doi: 10.16383/j.aas ...

  4. hough变换检测圆周_Python OpenCV 霍夫变换

    霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原 ...

  5. Hough变换检测直线与圆的原理

    霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体.霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的 ...

  6. matlab哈夫点线对偶运算,数字图像处理—图像分割—哈夫(Hough)变换及哈夫变换原理—检测直线...

    1.检测直线 n个点在一条直线上,连续的满足直线方程:同样,离散的也满足直线方程. 直线解决方法:先确定所有有任意2点决定的直线(需约 次运算以确定n(n - 1)/ 2条线).在找出接近具体直线的点 ...

  7. hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线

    Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...

  8. MATLAB编程 利用Hough变换检测圆

    MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸.更多下载资源.学习资料请访问CSDN下载频道.ht ...

  9. 直线/曲线检测:Randon变换与Hough变换

    一. Randon 变换 Radon变换简介 Tips: Radon变换的基本原理: 一个平面内沿不同的直线(直线与原点的距离为d,方向角为alfa)对f(x,y)做线积分,得到的像F(d,alfa) ...

最新文章

  1. inet_ntoa()返回字符串的生命周期
  2. iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
  3. 用concat批量生成MySQL查询语句
  4. pthread_create()在C和C++使用区别
  5. AndroidOpenCV摄像头预览旋转90度问题
  6. linux Audit 介绍【架构篇】
  7. Java实现Excel转PDF的两种方法总结
  8. 12.分布式定时任务(xxl-job)
  9. codeforces #630 F. Selection of Personnel
  10. 链路聚合Eth-Trunk
  11. android 强制退出程序,Android 强制且彻底的退出app
  12. Cesium深入浅出之如何获取帧率
  13. X86 Debuggers And Tools-x86_en-us 下载及使用
  14. 如何使用Python轻松解决TSP问题(遗传算法)
  15. shell if -n 参数
  16. 能吃的东西还有多少!!!!
  17. 【HTTP】如何避免OPTIONS请求?
  18. 洛谷P2255 动态规划
  19. 用老版计算机弹音乐少年,15年前,这部电影用音乐,拯救了一个迷失少年!
  20. MT7620的WIFI带机量

热门文章

  1. JVM从入门到精通(五): Java运行时数据区和常用指令
  2. 【WebPPTtoPDF】在线将PPT转化为PDF,支持自定义排列方式
  3. dart系列之:如丝滑般柔顺,操作文件和目录
  4. Leecode-198. 打家劫舍——动态规划(C++)
  5. 1025 反转链表 (25分)(最详细最简便)(套路模板)
  6. 算法竞赛入门经典(第二版) | 例题4-5 追踪电子表格中的单元格 (UVa512,Spreadsheet Tracking,World Finals)(解法一)
  7. [leetcode] 3.无重复字符的最长子串
  8. LinkedBlockingQueue的put,take方法
  9. android wifi信号通道,Android获取当前连接wifi的信道
  10. Web应用_Tomcat部署及优化