一、霍夫变换

1、霍夫变换是一种在图像中寻找直线、圆形及其他简单形状的方法。
2、笛卡尔空间与霍夫空间映射关系

  • 笛卡尔空间内的一条直线确定了霍夫空间内的一个点。
  • 霍夫空间内的一个点确定了笛卡尔空间内的一条直线。

3、霍夫变换选择直线的基本思路:选择由尽可能多条线汇成的点。

二、直线检测

1、绘制直线方法

  • 垂直方向的直线,计算它与图像水平边界的交叉点,在两个交叉点之间画线。
  • 水平方向的直线,在图像的第一列和最后一列之间画线。

2、cv.line优点

没有必要检查交叉点是否位于图像内部,即使点的坐标超出了图像的范围,也能正确画出线来。

3、基本霍夫变换——HoughLines函数
(1)要求:所操作的原图像是一个二值图像,变换之前先将原图像进行二值化或进行canny边缘检测。
(2)HoughLines检测到的是图像中的直线而不是线段,即检测到的直线是没有端点的。
(3)代码

# 直线检测
def line_detection(image):gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)"""HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)image:8位,单通道二值源图像rho:以像素为单位的距离r的精度,一般为1.theta:角度0的精度, CV.PI/180表示搜索所有可能的角度。threshold:阈值,线段超过设定的阈值才被检测出来。值越小,判定出的直线就越多。lines:检测到的直线的参数vector(ρ,θ) or (ρ,θ,votes) ;ρ是距坐标原点的距离,θ是以弧度表示的线旋转角度(0∼垂直直线,π/2∼水平直线) ,votes 曲线交点累加计数srn:stn:min_theta:检查线条的最小角度。必须介于0和maxθ之间。max_theta:要检查线条的最大角度。必须介于minθ和CV_PI之间"""lines = cv.HoughLines(edges, 1, np.pi / 180, 200)# 遍历lines,绘制出所有的直线for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * a)x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * a)cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)cv.imshow('image_lines', image)



2、概率霍夫变换——HoughLinesP函数

概率霍夫变换没有考虑所有的点,只需要一个足以进行检测的随机点子集即可。

def line_detect_possible_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)"""HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)minLineLength:用来控制“接受直线的最小长度”的值,默认0maxLineGap:用来控制接受共线线段之间的最小间隔,如果两点之间的最大间隔大于maxLineGap,认为这两点不在一条线上,默认0"""lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)for line in lines:x1, y1, x2, y2 = line[0]cv.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv.imshow('line_detect_possible_demo', image)


三、圆检测

霍夫圆变换中,需要考虑圆半径和圆心(x坐标,y坐标)共3个系数,采用的策略是两轮筛选。第1轮筛选找出可能存在圆的位置(圆心),第2轮再根据第1轮的结果筛选出半径大小。

def Mdetect_circles_demo(image):""":param image: pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None):return: src:输入图像,8位,三通道的彩色图像sp:定义的漂移物理空间半径大小sr:定义的漂移色彩空间半径大小dst:输出图像,跟输入src有同样的大小和数据格式maxLevel:定义金字塔的最大层数termcrit:定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合"""# pyrMeanShiftFiltering:漂移圆检测dst = cv.pyrMeanShiftFiltering(image, 50, 30)circles = np.uint16(np.around(dst))for i in circles[0, :]:cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('Mdetect_circles_demo', image)def circles_demo(image):# 消除噪声cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circle))for i in circles[0, :]:# 取圆心cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('circles_demo', image)def detect_circles_demo(image):# 消除噪声cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)"""HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)image:8位单通道灰度图像method:检测方法,HOUGH_GRADIENT:基于梯度做比较快且是唯一可用的参数值dp:累加器分辨率,用来指定图像分辨率与圆心累加器分辨率的比率。1表示输入图像和累加器具有相同的分辨率。minDist:圆心间的最小间距。如果存在圆心间距离小于该值的圆,仅有一个会被检测出来。如20:把小于20最近的多个合并成一个圆。circles:返回值,由圆心坐标和半径构成的numpy.ndarryparam1:缺省,默认100.对应是canny边缘检测器的高阈值(底阈值是高阈值的二分之一)param2:圆心位置必须收到的投票数。值越大,检测到的圆越少;越小,检测到的圆越多。缺省,默认100.minRadius:圆半径的最小值,小于该值的圆不会被检测出来。缺省,默认0,不起作用。maxRadius:圆半径的最大值,大于该值的圆不会被检测出来。缺省,默认0,不起作用。"""circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)"""around(a, decimals=0, out=None)a:输入列表或矩阵decimals:为n对输入近似后保留小数点后n位,默认为0,若值为-n,则对小数点左边第n位近似out:保存近似返回结果"""circles = np.uint16(np.around(circle))for i in circles[0, :]:# 图像,中心点位置,半径,颜色"""circle(img, center, radius, color, thickness=None, lineType=None, shift=None)img:单通道或多通道的图像center:圆心坐标radius:半径,数值为整数类型color:圆线条的颜色thickness:圆线条的粗细,值越大则线条越粗。lineType:线条的类型。CV_AA(采用了高斯滤波)三个值,分别代表8邻接连接线,4邻接连接线和反锯齿连接线,默认值为8邻接。shift:圆心坐标点和半径值的小数点位数,数值为整数类型。"""# 圆变换cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.imshow('detect_circles_demo', image)

霍夫变换——HoughLines、HoughLinesP和HoughCircles相关推荐

  1. OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )

    OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( ) 1.霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变 ...

  2. OpenCV-累计概率霍夫变换cv::HoughLinesP

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void HoughLinesP( InputArray image, OutputA ...

  3. 【车道线检测】霍夫变换(HoughLines)检测直线详解

    总结 霍夫变换是一种思想,用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲. 霍夫变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解, ...

  4. 《OpenCV3编程入门》学习笔记7 图像变换(二 )霍夫变换

    7.2 霍夫变换 7.2.1 概述 1.特征提取技术,运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题 ...

  5. 边缘检测、霍夫变换、重映射、仿射变换、直方图均衡化

    文章目录 1.基于 OpenCV 的边缘检测 1.1 边缘检测的一般步骤 1.2 canny 算子 1.2.1 canny 边缘检测的步骤 1.2.2 Canny 边缘检测:Canny() 函数 1. ...

  6. 【OpenCV】-霍夫变换

    序言: 什么是霍夫变换? 在图像处理和计算机视觉邻域中,如何从当前的图像中提前所需要的特征信息是图像识别的关键所在.霍夫变换可以快速准确地检测出直线或者圆,在图像处理中识别几何形状的基本方法之一,最基 ...

  7. OpenCV学习12_霍夫变换与重映射

    一.霍夫变换 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Houg ...

  8. 利用霍夫变换做直线检测的原理及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫变换的原理大家可以参考博文 霍夫变换_tie ...

  9. 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

最新文章

  1. java8升级java11到底敢不敢?
  2. 栈,寄存器,局部变量,内存,语言级别优化程序的方法
  3. 如何防止通过url攻击_什么是XSS攻击?如何防御XSS攻击?
  4. opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...
  5. CUDA层硬件debug之路
  6. linux 关闭scp服务器,Linux系统如何关闭scp和sftp命令
  7. 盘阵多路径学习(转)
  8. MariaDB 在 RedHat Linux 上的安装过程以及 MySQL 相关命令的使用
  9. python 生孩子朋友圈_生娃报喜朋友圈文案 孩子出生发朋友圈的话
  10. IC前端设计使用的EDA软件
  11. xlsxwriter去掉网格线_python之xlsxwriter模块(可操作xls/xlsx格式文件)
  12. Java:pdf文件中添加图片
  13. 复利思维,静待时间的玫瑰慢慢绽放
  14. 苹果技术支持联系方式
  15. Ubuntu安装NS3出现./build.py失败解决
  16. 漫画制作软件EasyComic V1.7发布
  17. 基于SVM的猫咪图片识别器
  18. 怎样把PDF图片旋转90度
  19. 别在@官方加国旗啦,3分钟30行Python代码帮你搞定!还加鸡腿,加IPhone11!
  20. 信息时代碎片化学习的理解

热门文章

  1. java如何爬取qq音乐_QQ音乐评论爬取
  2. 用Python数据分析告诉你,《三十而已》凭什么这么戳中观众的心
  3. 如何考察候选人 Vue 技术水平?
  4. ESP-Skainet智能语音助手,智能物联网方案,语音唤醒识别准确率高
  5. 汇报就是生产力:PPT使用技巧总结
  6. Segue 类型介绍
  7. 开关电源DC/DC的直流电流、交流电流、电感纹波电流、电流纹波率
  8. CMMI评估--SCAMPI
  9. 远光软件:在电力行业部署区块链,胜算几何 |追击上市公司
  10. ehd边缘直方图描述子 matlab,大连理工大学数字图像处理 实验报告4