车道线检测_Canny算子边缘检测_1

Canny算子边缘检测(原理)

Canny算子边缘检测是一种经典的图像处理算法,由John F. Canny于1986年提出,用于精确、可靠地检测数字图像中的边缘特征。该算法设计时考虑了三个关键目标:低错误率(即尽可能多地检测真实的边缘,同时避免误报)、边缘定位的准确性(确保检测到的边缘位置与实际边缘位置紧密对应)以及边缘的单响应性(确保图像中的每一个边缘只被检测一次,避免重复或断裂)。Canny算子通过以下五个核心步骤实现这些目标:

  1. 图像灰度化

    • 如果输入图像为彩色,首先将其转换为灰度图像,因为Canny算子适用于处理单通道灰度图像。
  2. 高斯滤波(高斯模糊)

    • 应用高斯平滑滤波器对灰度图像进行滤波,以消除图像中的噪声。高斯滤波器通过卷积操作将每个像素值替换为周围像素值的加权平均,其中权重由二维高斯函数确定。这种滤波方式既能有效减弱噪声,又能较好地保留边缘细节,避免过度模糊导致边缘定位模糊。
  3. 计算梯度幅值和方向

    • 对经过高斯滤波的图像计算其梯度。梯度表示图像中像素灰度值的变化率,包含了边缘强度和方向的信息。通常使用一阶偏导数的近似算子(如Sobel算子、Prewitt算子或Roberts算子)来计算水平和垂直方向的梯度分量。然后根据这两个分量计算出梯度幅值(即边缘强度)和梯度方向。梯度方向通常用于后续的非极大值抑制步骤。
  4. 非极大值抑制

    • 该步骤旨在去除非边缘像素的响应,仅保留真正的边缘点。在梯度方向的直线上,检查每个像素的梯度幅值是否为其邻域内(在其梯度方向上)的最大值。如果不是,说明该像素可能不是真正的边缘点,将其梯度幅值置零或降低。这样可以消除边缘检测过程中的许多虚假响应,确保最终得到的边缘轮廓更为精确。
  5. 双阈值检测与边缘连接

    • 设置高低两个阈值,通常选择高阈值来确定强边缘,低阈值用于连接可能断开的弱边缘。具体操作如下:
      • 首先,将梯度幅值大于高阈值的像素标记为边缘像素,形成初步的边缘集。
      • 然后,对于幅值介于高低阈值之间的像素,如果它们与已标记为边缘的像素相邻(即位于已检测边缘的8邻域内),也被认为是边缘像素,以保证边缘的连续性。
      • 最终,只有通过上述条件的像素才被认为是有效的边缘点,其余像素则被舍弃。这种方法有助于减少边缘断裂的同时,抑制噪声引起的伪边缘。

        Canny算子通过一系列精心设计的步骤,实现了对图像边缘的稳健、精确检测,即使在存在噪声干扰的情况下也能保持较高的性能。由于其出色的综合性能,Canny算子在计算机视觉、图像分析、机器视觉等领域中被广泛应用,特别是在需要精确边缘信息的应用场景中,如物体轮廓检测、运动目标跟踪、图像分割等。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

边缘检测是基于灰度突变来分割图像的常用方法,其实质是提取图像中不连续部分的特征。目前常见边缘检测算子有差分算子、 Roberts 算子、 Sobel 算子、 Prewitt 算子、 Log 算子以及 Canny 算子等。

其中, Canny 算子是由计算机科学家 John F. Canny 于 1986 年提出的一种边缘检测算子,是目前理论上相对最完善的一种边缘检测算法。

Canny 算子在 MATLAB 、 OpenCV 等常用图像处理工具中已有内置的 API。

在 OpenCV 中, Canny 算子使用的函数是 Canny() ,它的原函数如下:

def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)

  • image: 表示此操作的源(输入图像)。
  • threshold1: 表示迟滞过程的第一个阈值。
  • threshold2: 表示迟滞过程的第二个阈值。

接下来,接着操作我们之前的马里奥,对马里奥做一次边缘检测看下效果:

import cv2 as cv
from matplotlib import pyplot as plt# 图像读入
img = cv.imread('maliao.jpg', 0)
edges = cv.Canny(img, 100, 200)# 显示结果
titles = ['Original Img', 'Edge Img']
images = [img, edges]# matplotlib 绘图
for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

图像转化(彩->灰)

  图像转化原因:边缘检测最关键的部分是计算梯度,颜色难以提供关键信息,并且颜色本身非常容易受到光照等因素的影响,所以只需要灰度图像中的信息就足够了。并且灰度化后,简化了矩阵,提高了运算速度。

    原理:将彩色图像(Color Image)转换为灰度图(Gray Scale Image),即从三通道RGB图像转为单通道图像。

    实现:我们实现彩图转化为灰度图需要用到opencv库中的cv.cvtColor函数,需要用到两个参数:src——输入图片,code——颜色转换代码,代码如下:

# 灰度图转换
def grayscale(num_img):for i in range(num_img):filename = 'img' + str(i) + '.jpg'img = cv2.imread(filename)img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)filename = 'img_gray' + str(i) + '.jpg'cv2.imwrite(filename, img_gray)

生成Mask掩膜,提取 ROI

代码如下:

# 生成感兴趣区域即Mask掩模
def region_of_interest(image, vertices):mask = np.zeros_like(image)  # 生成图像大小一致的zeros矩# 填充顶点vertices中间区域if len(image.shape) > 2:channel_count = image.shape[2]ignore_mask_color = (255,) * channel_countelse:ignore_mask_color = 255# 填充函数cv2.fillPoly(mask, vertices, ignore_mask_color)masked_image = cv2.bitwise_and(image, mask)return masked_image

Hough变换的路沿检测

Hough变换(原理)

        Hough变换是一种使用表决方式的参数估计技术,其原理是利用图像空间和Hough参数空间的线-点对偶性,把图像空间中的检测问题转换到参数空间中进行

基于霍夫变换的直线检测

用到的是Opencv封装好的函数cv.HoughLinesP函数,使用到的参数如下:

image:输入图像,通常为canny边缘检测处理后的图像
rho:线段以像素为单位的距离精度
theta:像素以弧度为单位的角度精度(np.pi/180较为合适)
threshold:霍夫平面累加的阈值
minLineLength:线段最小长度(像素级)
maxLineGap:最大允许断裂长度
具体代码如下:

def hough_lines(img, rho, theta, threshold, min_line_len, max_line_gap):# rho:线段以像素为单位的距离精度# theta : 像素以弧度为单位的角度精度(np.pi/180较为合适)# threshold : 霍夫平面累加的阈值# minLineLength : 线段最小长度(像素级)# maxLineGap : 最大允许断裂长度lines = cv.HoughLinesP(img, rho, theta, threshold, np.array([]), minLineLength=min_line_len, maxLineGap=max_line_gap)return lines

高斯滤波

高斯滤波算法是一种去除高频噪声的常用方式,通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值都是由其本身和邻域内的其他像素值经过加权平均后得到的。高斯滤波的原理是根据待滤波的像素点及其邻域点的灰度值按照高斯公式生成的参数规则进行加权平均。

我们这一步需要用到opencv库中的cv.GaussianBlur函数,其中使用到的参数为:src——输入图像,kernel_size——高斯核的大小,sigma——高斯标准差(一般默认为0),具体代码如下:

# 高斯滤波
def gaussian_blur(image, kernel_size):return cv.GaussianBlur(image, (kernel_size, kernel_size), 0)

绘制高斯滤波后的效果图:

  1. 绘制车道线

图像融合

参考文章:python --opencv图像处理Canny算子边缘检测(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)_分别用roberts算子、sobel算子、prewitt算子、拉普拉斯算子、log算子和canny算-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296694.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】WordPress Plugin LearnDash LMS 敏感信息暴漏

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin LearnDash LMS 4.10.2及之前版本存在安全漏洞&#x…

从汇编看函数调用

文章目录 函数调用流程栈相关寄存器及的作用简介寄存器功能指令功能 栈函数的括号{}正括号反括号 参数传递传值,变量不可改传指针,变量可改C 传引用 函数调用实例 函数调用流程 目标:函数调用前后栈保持不变 保存main函数的寄存器上下文移…

使用MySQL和PHP创建一个公告板

目录 一、创建表 二、制作首页(创建主题以及显示列表) 三、制作各个主题的页面(输入回帖和显示列表) 四、制作消息的查询界面 五、制作读取数据库信息的原始文件 六、制作数据重置页面 七、效果图 八、问题 1、目前无法处…

商务电子邮件: 在WorkPlace中高效且安全

高效和安全的沟通是任何组织成功的核心。在我们关于电子邮件类型的系列文章的第二期中,我们将重点关注商业电子邮件在促进无缝交互中的关键作用。当你身处重要的工作场环境时,本系列的每篇文章都提供了电子邮件的不同维度的视角。 “2024年,全…

基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …

保健品wordpress外贸模板

保健品wordpress外贸模板 健康保养保健品wordpress外贸模板,做大健康行业的企业官方网站模板。 https://www.jianzhanpress.com/?p3514

防火墙状态检测和会话机制

FW对TCP,UDP和ICMP协议的报文创建会话

【如何解决一些常见的 Composer 错误的保姆级讲解】

🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢?因为openai已经取消了免费的5刀赠送,那么这些人手上的免费的sses-key 用完后,就基本上全军覆没了,再…

在 Amazon Timestream 上通过时序数据机器学习进行预测分析

由于不断变化的需求和现代化基础设施的动态性质,为大型应用程序规划容量可能会非常困难。例如,传统的反应式方法依赖于某些 DevOps 指标(如 CPU 和内存)的静态阈值,而这些指标在这样的环境中并不足以解决问题。在这篇文…

vscode + wsl1 搭建远程C/C++开发环境

记录第一次搭建环境过程。 搭建C/C开发环境有很多种方式,如 MinGW vscode(MinGW 是GCC的Windows版本,本地编译环境)SSH隧道连接 vscode(远程Linux主机)wsl vscode(远程Linux环境&#xff09…

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts (或菜单)打…

node.js的错误处理

当我打开一个不存在的文件时,错误如下: 在读取文件里面写入console.log(err),在控制台中可以看到我的错误代码类型:文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…

Redhat 7.9 安装dm8配置文档

Redhat 7.9 安装dm8配置文档 一 创建用户 groupadd -g 12349 dinstall useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba二 创建目录 mkdir /dm8 chown -R dmdba:dinstall /dm8三 配置/etc/security/limits.conf dmdba soft nproc 163…

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能,通常步骤如下: 在Controller类中,定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…

【javaScript】DOM编程入门

一、什么是DOM编程 概念:DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改,以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢?我们就得先理解网页的运行原理: 如上图&a…

达梦配置ODBC连接

达梦配置ODBC连接 基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例1 下载ODBC包 下载网址:https://www.unixodbc.org/ unixODBC-2.3.0.tar.gz2 编译并…

C++的并发世界(六)——互斥解决数据共享冲突

0.数据共享的问题 在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要…

Java快速入门系列-1(Java概述)

第一章:Java概述 1.1 Java的发展历程1.2 Java的特点与优势1.2.1 特点1.2.2 优势 1.3 Java生态系统介绍1.4 Java在当前技术领域的应用案例 1.1 Java的发展历程 Java语言由Sun Microsystems公司于1995年推出,由James Gosling领导的Green Team小组研发而成…

SpringCloud - 如何本地调试不会注册到线上环境(Nacos)?

问题描述 有时候我们需要本地调试注册到 Nacos 上,但是会影响线上服务的 Feign 请求打到本地导致不通影响了线上业务。 原因分析 一般最传统的解决方案就是修改本地 bootstrap.yml 的 spring.cloud.nacos.discovery.namespace spring:application:name: app-serv…