计算机视觉——边缘检测与霍夫变换

2024-03-25 16:18

本文主要是介绍计算机视觉——边缘检测与霍夫变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的:

了解OpenCV中canny边缘检测函数的用法,并选取图像进行测试,观察阈值对结果的影响。

实现基于霍夫变换的图像圆检测(边缘检测可以用opencv的canny函数)。

一.Canny边缘检测

1.实验目的:了解OpenCV中canny边缘检测函数的用法,并选取图像进行测试,观察阈值对结果的影响。

2.Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。

通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。

3.步骤:Canny边缘检测算法可以分为以下5个步骤:

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

3.void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
Mat srcImage = imread(Path);
Mat srcGray;
cvtColor(srcImage, srcGray, CV_BGR2GRAY);
//高斯滤波
GaussianBlur(srcGray, srcGray, Size(3, 3),
0, 0, BORDER_DEFAULT);
//Canny检测
int edgeThresh =100;
Mat Canny_result;
Canny(srcImage, Canny_result, edgeThresh, edgeThresh * 3, 3);
imshow(“src”, srcImage);
imshow(“Canny_result”, Canny_result);
waitKey(0);
在这里插入图片描述
下面是阈值从小到大的调节过程:

在这里插入图片描述在这里插入图片描述

(70,200)
在这里插入图片描述
(40,60)
尝试加入滑动条:

在这里插入图片描述在这里插入图片描述

注意:调用Canny函数的输入和输出图像不能是一个名字,否则就会不断迭代canny:

在这里插入图片描述

二.霍夫圆检测

1.实验目的:实现基于霍夫变换的图像圆检测(边缘检测可以用opencv的canny函数)。

  1. 实验原理:在笛卡尔坐标下,圆的表示方程为:(x-a)²+(y-b)²=r²;但在极坐标下,假设已知圆心(x0,y0),那么圆上的点可以表示为:

对于任意一个圆, 假设中心像素点p(x0, y0)像素点已知, 圆半径已知,则旋转360度,由极坐标方程可以得到每个点上的坐标。同样,如果只是知道图像上像素点, 圆半径,旋转360°,则会有一个集中的交点,即圆心,也就是说圆点处的坐标值最强,这正是霍夫变换检测圆的数学原理。

3.经典方法:

3.1对直线来说, 一条直线能由参数极径极角 (γ, θ) 表示. 而对圆来说, 需要三个参数来表示一个圆。现在原图像的边缘图像的任意点对应的经过这个点的所有可能圆是在三维空间有下面这三个参数来表示了,其对应一条三维空间的曲线. 那么与二维的霍夫线变换同样的道理,对于多个边缘点越多这些点对应的三维空间曲线交于一点那么他们经过的共同圆上的点就越多。

类似的我们也就可以用同样的阈值的方法来判断一个圆是否被检测到, 这就是标准霍夫圆变换的原理, 但也正是在三维空间的计算量大大增加的原因, 标准霍夫圆变化很难被应用到实际中。

3.2 opencv中实现的圆检测算法,一般算法为取参考点,对于边缘像素点计算梯度角,对每一个梯度角,存储对应于参考点的距离和角度;算法具有较好的抗干扰性,但也需要较大的存储空间和计算量,如下是opencv圆检测算法的思路:

4.霍夫变换,两个阶段:

(1)检测圆心:圆心是它所在圆周所有法线的交汇处,因此只要找到这个交点,即可确定圆心:
对输入图像边缘检测;
 计算图形的梯度,并确定圆周线,其中圆周的梯度就是它的法线;
 在二维霍夫空间内绘出所有图形的梯度直线,坐标点累加和的值越大,则该点上直线相交的次数越多,该点越有可能是圆心;
 在霍夫空间的4邻域内进行非最大值抑制;
 设定一个阈值,霍夫空间内累加和大于该阈值的点就对应于圆心。

(2)测圆半径的方法是从圆心到圆周上的任意一点的距离相同,首先确定一个阈值,只要计算得到相同距离的数量大于该阈值,就认为该距离就是该圆心所对应的圆半径:
 计算某一个圆心到所有圆周线的距离,这些距离中就有该圆心所对应的圆的半径的值,这些半径值当然是相等的,并且这些圆半径的数量要远远大于其他距离值相等的数量;
 设定两个阈值:最大半径和最小半径。保留距离在这两个半径之间的值,这意味着我们检测的圆不能太大,也不能太小;
 对保留下来的距离进行排序;
 找到距离相同的那些值,并计算相同值的数量;
 设定一个阈值,只有相同值的数量大于该阈值,就认为该值是该圆心对应的圆半径;
 对每一个圆心,完成上面的步骤,得到所有的圆半径。

  1. HoughCircles函数的原型为:
    void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0,int maxRadius=0 )
    image为输入图像,要求是灰度图像
    circles为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半径
    method为使用霍夫变换圆检测的算法,Opencv2.4.9只实现了2-1霍夫变换,它的参数是CV_HOUGH_GRADIENT
    dp为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推
    minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心
    param1、param2为阈值
    minRadius和maxRadius为所检测到的圆半径的最小值和最大。
    特定参数检测效果:
    在这里插入图片描述在这里插入图片描述6.发现的一些问题:
    (1)对一些不是很规整的图片是很难找到圆的
    在这里插入图片描述(2)依赖于参数的调节,参数不当会出现如下情况
    在这里插入图片描述调整后Mindist= edges.rows / 5

在这里插入图片描述

//边缘检测
#include<cv.h>
#include<highgui.h>
#include<iostream>
#include<io.h>
#include<opencv2\opencv.hpp>   using namespace std;
using namespace cv;Mat img,DstPic, edge, grayImage, edge1;
int min1;
int max1;
static void CANNY(int,void*)
{Canny(edge, edge1, min1, max1, 3);imshow("canny", edge1);
}
int main()
{img = imread("D:\\picture\\circle.jpg");imshow("原始图", img);namedWindow("canny", 0);//创建与src同类型和同大小的矩阵DstPic.create(img.size(), img.type());DstPic = Scalar::all(0);//将原始图转化为灰度图cvtColor(img, grayImage, COLOR_BGR2GRAY);//先使用3*3内核来降噪blur(grayImage, edge, Size(5, 5));//运行canny算子min1 = 150; max1 = 230;//Canny(edge, edge, 70, 100, 3);createTrackbar("minvalue", "canny", &min1, 200, CANNY);createTrackbar("maxvalue", "canny", &max1, 300, CANNY);CANNY(min1,0);	CANNY(max1, 0);waitKey(0);
}
//霍夫变换
#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  using namespace cv;
using namespace std;
int main()
{Mat edges;  //定义转化的灰度图namedWindow("【效果图】", CV_WINDOW_NORMAL);while (1){Mat frame;Mat img = imread("D:\\picture\\circle3.jpg");//capture >> frame;if (!img.data)return -1;cvtColor(img, edges, CV_BGR2GRAY);//高斯滤波GaussianBlur(edges, edges, Size(7, 7), 2, 2);vector<Vec3f> circles;//霍夫圆//HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1, edges.rows / 5, 150, 70, 0, 0);for (size_t i = 0; i < circles.size(); i++){Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));int radius = cvRound(circles[i][2]);//绘制圆心  circle(img, center, 3, Scalar(0, 255, 0), -1, 8, 0);//绘制圆轮廓  circle(img, center, radius, Scalar(155, 50, 255), 2, 8, 0);}imshow("【效果图】", img);waitKey(30);}return 0;
}

点击观看机器视觉视频学习

这篇关于计算机视觉——边缘检测与霍夫变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845551

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i