车道线检测_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.hqwc.cn/news/577921.html

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

相关文章

2核2G3M轻量应用服务器价格3.8元/月、50元1年、296元3年

京东云2核2G3M服务器价格3.8元/月、50元一年、296元3年,配置2C2G-40G SSD系统盘-3M带宽-200G月流量 华北-北京,京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图: 京东云2核2G3M服务器价格 京东云:轻量云主机CPU内存&…

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用1、OSI 的七层模型分别是?各自的功能是什么?2、说一下一次完整的HTTP请求…

【爬虫开发】爬虫从0到1全知识md笔记第2篇:requests模块,知识点:【附代码文档】

爬虫开发从0到1全知识教程完整教程(附代码资料)主要内容讲述:爬虫课程概要,爬虫基础爬虫概述,,http协议复习。requests模块,requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…

财富池指标--通达信顾比均线实战指标免费源码

顾比均线是由两组均线构成,短期组为3、5、8、10、12、15。长期组为:30、35、40、45、50、60。顾比均线由澳大利亚的投资家戴若-顾比先生发明,因此叫顾比线。 顾比均线可以广泛运用于股票、期货和外汇交易中,只要是能运用K线图的投…

<QT基础(3)>QLineEdit使用笔记

LineEdit 这次要用的是两个功能:初始化展示参数值,修改参数值。 初始化 将l_num的默认值显示 ui.lineEdit->setText(QString::number(l_num));信号 textChanged() 文本发生改变textEdited() 文本编辑信号cursorPositionChanged()光标发…

KVM:尝试安装windows2008

最终目的是在lxd部署windows2008镜像 WindowsServer2008镜像: cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso 镜像参考链接: https://discussion.scottibyte.com/t/migrate-a-hyper-v-windows-vir…

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双,玩了几天,觉得…

Codeforces Round 937 (Div. 4)

目录 A. Stair, Peak, or Neither? B. Upscaling C. Clock Conversion D. Product of Binary Decimals E. Nearly Shortest Repeating Substring F. 0, 1, 2, Tree! G. Shuffling Songs A. Stair, Peak, or Neither? 直接按照题意模拟即可 void solve(){int a,b,c; c…

YOLOv9改进策略 : C2f改进 | 引入YOLOv8 C2f结构

💡💡💡本文改进内容:应订阅者需求,如何将YOLOv8 C2f结构引入到YOLOv9 💡💡💡C2f层是一种特殊的卷积层,用于将不同尺度的特征图融合在一起,以提高目标检测的准…

真心建议今年拿下软考证书,再不冲就晚了!

随着国家计算机与软件技术的发展,每年报名参加计算机软件资格考试(简称:软考)的人越来越多。 据工信部新闻发布会消息:2023年有超500万人都在考软考,报名人数较2020年直翻10倍。 据悉,国内持软…

leetcode216组合总和III

本题思考: 对于输入样例k3,n9 输出里面为什么只有 [[1,2,6],[1,3,5],[2,3,4]]而没有下图所示的重复情况出现呢? 当时代码写错了,思考许久不得解,后面经过仔细对比代码之后发现是我的代码出现了逻辑错误,而正是这一关键…

了解一下npm i的流程与原理

流程 执行npm install,先判断有无lock文件。 1、没有lock文件。会先根据依赖构建出扁平的依赖关系决定下哪些包。新版本的依赖关系是扁平化的,老版本是树结构,可能会出现依赖重复安装的问题,老版本示意图如下: 作为前…