目录

引言

一、canny算子

二、canny算子代码

三、霍夫变换检测直线

四、霍夫变换检测直线代码

五、霍夫变换检测直线效果

六、霍夫变换检测圆

七、霍夫变换检测圆代码

八、霍夫变换检测圆效果


引言

canny算子是计算机视觉最常用的一种算子,是目前一种非常流行的算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由Paul Hough(霍夫)于1962年首次提出。本文将介绍canny算子与霍夫变换检测圆与直线,附完整可运行代码,希望可以带来帮助。

一、canny算子

canny算子可以分为以下几步:

  1. 应用高斯滤波来平滑图像,目的是去除噪声
  2. 找寻图像的强度梯度(intensity gradients)
  3. 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
  4. 应用双阈值的方法来决定可能的(潜在的)边界
  5. 利用滞后技术来跟踪边界

先看下lena经canny算子的效果图:

高斯滤波其实就是将所指像素用周围的像素的某种均值代替(即卷积核),卷积核尺寸越大,去噪能力越强,因此噪声越少,但图片越模糊,canny检测算法抗噪声能力越强,但模糊的副作用也会导致定位精度不高。高斯的卷积核大小推荐:一般情况下,尺寸5 * 5,3 * 3也行。

二、canny算子代码

import cv2
img =  cv2.imread("lena.png")
img_5 = cv2.Canny(img, 100, 200)
cv2.namedWindow("W5")
cv2.imshow("W5", img_5)
cv2.imwrite("canny_img.jpg",img_5)
cv2.waitKey()
cv2.destroyAllWindows()

三、霍夫变换检测直线

霍夫直线检测利用图像与霍夫空间中点与线的对偶性,将图像空间中待检测的离散像素点集通过参数方程映射为霍夫空间中极坐标上的曲线集,并将曲线的交点作为通过n个离散点的直线方程参数映射到图像空间中的直线。即点(图像空间)-线(霍夫空间)-交点(霍夫空间)-线(图像空间)。将找直线问题转换为找交点问题,同时考虑到笛卡尔坐标系存在垂直线无法检测的问题,因而利用极坐标去表示,转换为曲线交点检测。
HoughLine函数:

HoughLine(inputimage,outputline,double rho,double theta,int tereshold,double srn=0,double stn=0)

霍夫变换基于opencv的实现
@para1:输入图像,需要为8位单通道二进制图像
@para2:储存输出的矢量线条,用θ,ρ表示。ρ为直线离坐标原点(图像左上角)的距离。θ表示弧度线条旋转角度(0为垂线,π/2为水平线)
@para3:以像素为单位的距离精度(即搜索直线时ρ轴的步进分辨率,一般为1)
@para4:以弧度为单位的角度精度(即搜索直线时θ轴的步进分辨率,一般为CV_PI/180,即1度)
@para5:累加空间的阈值参数,即识别直线时在累加空间必须达到的阈值,大于threshold的线段才能被认为检测到。
@para6:默认值0。对于多尺度霍夫变换srn表示@para3步进分辨率的除数距离。
@para7:默认值0。对于多尺度霍夫变换stn表示@para4步进分辨率的除数距离。如果srn和stn都为0时表示经典霍夫变换,否则应为正数。

四、霍夫变换检测直线代码

import cv2
import numpy as np
def lines_judge(img):o = img.copy()# 使用中值滤波进行降噪o = cv2.medianBlur(o, 5)# 从彩色图像变成单通道灰度图像gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)# 绘制边缘图像binary = cv2.Canny(o, 50, 150)# 检测直线 不限步长,不限角度,至少50个点确定一条线lines = cv2.HoughLines(binary, 1, np.pi / 180, 285)# print(lines)# print(lines.shape)try:list = [ line for line in lines]except TypeError or IndentationError:print("未检测到直线!")else: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))cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)cv2.imshow("img", img)cap = cv2.VideoCapture(0) # 调用本地摄像头
while True:flag,frame = cap.read()if not flag:breaklines_judge(frame)if ord("q") == cv2.waitKey(1):break
cv2.waitKey()
cv2.destroyAllWindows()

五、霍夫变换检测直线效果

车道识别视频

看看代码运行的效果:我在电脑里插入一段视频,和前面的原理类似,捕获每一帧,如果在这一帧里检测到直线就标出来,没检测的话在对话框里给出反馈:没检测到直线。这样在调整参数时,更加直观。

六、霍夫变换检测圆

Hough Transform(霍夫变换)是早期的一种以投票方案进行图形拟合的算法。所谓拟合就是要将图像中的一些边缘用数学方式来描述,可以使人们更好的操作使用图像提供的信息。相比较最小二乘法、鲁棒估计以及RANSAC方法,霍夫变换的优点在于可以进行多目标的拟合。本次在此讨论研究霍夫圆的拟合原理。

霍夫圆算法的实现一共可分为两个步骤:

  • 建立霍夫参数三维空间,并对空间内各个单元进行投票
  • 设置阈值从投票结果中筛选合适的圆,并做非极大化抑制

详细了解可以看这篇文章:霍夫变换检测圆

七、霍夫变换检测圆代码

import cv2
import numpy as npdef decodeDisplay(video, flag):gay_img = cv2.cvtColor(video, cv2.COLOR_BGRA2GRAY)img = cv2.medianBlur(gay_img, 7)  # 进行中值模糊,去噪点cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=100, maxRadius=150)if circles is not None:circles = np.uint16(np.around(circles))print(circles)for i in circles[0, :]:  # 遍历矩阵每一行的数据cv2.circle(video, (i[0], i[1]), i[2], (0, 255, 0), 2)cv2.circle(video, (i[0], i[1]), 2, (0, 0, 255), 3)cv2.imshow("gay_img", video)else:pass# 如果识别不出,显示圆心不存在# print('x: None y: None')# cv2.imshow('frame', video)def detect():cap = cv2.VideoCapture(0)while True:# 逐帧捕获ret, frame = cap.read()# cv2.imshow("img", frame)flag = cv2.waitKey(1)if ord("q") == flag:breakelse:flag = decodeDisplay(frame, flag)
# 一切完成后,释放捕获cap.release()cv2.destroyAllWindows()if __name__ == '__main__':detect()

八、霍夫变换检测圆效果

霍夫变换检测圆

同样我们直接看视频:在我的手里是一个圆形的物体,我调用本地摄像头,对图片检测。可以看到,检测效果很好,绿色的标记一直跟着我的手在运动;并且左下角不断输出着圆心的坐标。

好啦,今天的分享就到这里啦!有什么问题或者发现错误的地方都可以在评论区或者私信联系我哦!

文章最后附canny算子可视调参数的工具链接:https://pan.baidu.com/s/1jIWS1zif8ddi-1LPIjrEaw?pwd=xpj0 
提取码:xpj0

Canny算子与霍夫变换检测圆与直线相关推荐

  1. 霍夫变换检测圆c 语言,c++ 霍夫变换检测直线

    通常这是一幅边缘图像,比如来自 Canny算子.cv:: Houghlines函数的输出是 cV::Vec2f向量,每个元素都是一对代表检测到的直线的浮点数(p,0).在下例中 我们首先应用 Cann ...

  2. opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用

    opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用 1)cvHonghLines2:直线 2)cvHoughCircles:该函数用Hough变换在二值图像中 ...

  3. Matlab findcircle函数实现 霍夫变换——检测圆

    Matlab findcircle函数实现 霍夫变换--检测圆 实现了基于霍夫变换的findcircle函数,function[circlefind]=findcircle(img,minr,maxr ...

  4. 霍夫变换MATLAB怎么实现,做过Matlab关于霍夫变换检测圆的高手请进

    Hough变换对圆的检测 Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线. Hough对圆的检测程序如下  完整的程序及 ...

  5. OpenCvSharp手绘ROI区域+模板匹配+霍夫变换检测圆的边界

    最终效果如下: 左侧为检测图片.右侧为模板,右下角textbox为轮毂中心的像素坐标 操作步骤: 1.点击打开图像选择一张比较不错的图片,用于画模板: 2.在picturebox中画取ROI区域生成模 ...

  6. 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆

    我正在尝试使用霍夫变换来检测圆圈. 使用我当前的代码,我可以检测到下面的代码 但我想在我发现的圆圈内找到黑洞. 然而,改变houghcircle方法的参数对我没有帮助.实际上它找到了不存在的圆圈. 此 ...

  7. 从零开始实现霍夫变换检测图像直线算法 python

    创作不易,如果对您有帮助,帮忙点赞哦! 一. 霍夫变换理解: 可参考:https://www.cnblogs.com/hellcat/p/9896426.html 二. 霍夫变换简介: 霍夫变换,是将 ...

  8. python 图像变化检测_霍夫变换检测图像直线算法python实现

    创作不易,如果对您有帮助,帮忙点赞哦! 一. 霍夫变换理解: 二. 霍夫变换简介: 霍夫变换,是将坐标由直角坐标系变换到极坐标系,然后再根据数学表达式检测某些形状(如直线和圆)的方法.当 l1直线 上 ...

  9. 理解霍夫变换及圆检测

    近日在做小球动力特性识别过程中,用到了opencv中的霍夫变换圆检测来识别图像中的小球,从而确定小球的位置.但是在调节参数的过程中不能明确各参数的真正含义,无法达到最优的识别效果. 所以想深入理解霍夫 ...

最新文章

  1. 【Sql Server】DateBase-事务
  2. 编程以外积累: 如何给项目生成类似VS2008的说明文档
  3. MD5与Base64的思考
  4. 6、Gerrit插件
  5. before css 旋转_七夕,当然少不了纯CSS的点缀啦
  6. 最容易理解的计算机网络 基础知识概论(下)
  7. 量子计算机打破智子封锁,人类科技会被“智子”锁死?来看量子计算机如何打破技术壁垒...
  8. C++decltype关键字
  9. 转:【图文教程】创建Xcode自定义模板
  10. jQuery在线手册
  11. 游侠联机显示无法链接服务器,我的世界用游侠联机时连接不上
  12. CreateFile
  13. macOS中安装docker
  14. 贪吃蛇python语言代码_Python贪吃蛇简单的代码
  15. 文献补充材料怎么下载?
  16. Mezzanine基于 Django 的CMS系统框架搭建
  17. nodejs中的事件events
  18. 抖音上热门规则优化及矩阵爆粉秘籍
  19. java url生成二维码
  20. 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统

热门文章

  1. Delphi - Indy TIdFTPServer封装类
  2. PHP基础学习第二课(HTML表格)的详细解说和制作
  3. C++ 静态库和动态库的区别
  4. SAP ABAP 一个有用的程序正确性辅助工具,Checkpoint group 的使用方法介绍试读版
  5. 关于计算机英语作文60词,关于计算机的英语作文
  6. AP计算机A自学笔记:Comparable接口
  7. 14种机器学习常见算法分类汇总
  8. python 求和并排序_python中list求和的方法有哪些?
  9. HPA:人类蛋白图谱数据库
  10. H5案例课—5点连线画一个爱-岑远科-专题视频课程