由于基于边缘检测的分析不易受到整体光照强度变化的影响,许多图像理解方法都以边缘为基础。边缘检测强调的是图像的对比度。检测对比度,即亮度上的差别,可以增图像中的边界特征,这些边界正是图像对比度出现的地方。这就是人类视觉感知目标周界的机制,因为目标表现的就是与他周围的亮度差别。目标边界实际上时亮度级的梯度变化,而边缘是梯度变化的位置。

一. 一阶边缘检测算子

1.1 基本算子

亮度变化可以通过对相邻点进行差分处理来增强。对水平方向上的相邻点进行差分处理可以检测垂直方向上的亮度变化,称为水平边缘检测算子。把它用于图像P时,水平边缘检测算子的处理结果会形成两个水平相邻点的差值,这样就检测出垂直边缘,Ex,如:

为了检测水平边缘,我们需要一个垂直边缘检测算则对垂直方向上的相邻点进行差分处理。这样可以确定水平方向上而不是垂直方向上的亮度变化,因此垂直边缘检测算子检测的是水平边缘,Ey,如:

将这两个算子合并得出算子E,它可以同时检测垂直和水平边缘,即:

由此得出:

式(1-4)给出了差分模板的系数,它可以与图像做卷积运算检测所有边缘点。该式对应的模板如图1-1所示。

1.2 Prewitt边缘检测算子

边缘检测类似于微分处理。由于它检测的是变化,必然对噪声以及图像亮度的阶梯式变化都有响应。因此把均值处理加入到边缘检测过程一定要非常谨慎。把垂直模板Mx扩展成三行,把水平模板My扩展成三列,这样就得到Prewitt边缘检测算子。它由两个模板组成,如图1-2.

Prewitt算子给出两个结果:沿每个坐标轴的亮度变化率,边缘强度M是向量的长度,而边缘方向θ是向量的角度。

1.3 Sobel边缘检测算子

如果使两个Prewitt模板中心像素的权重取2倍的值,便是Sobel边缘检测算子。Sobel算子的模板如图1-3所示:

OpenCV代码实例:

void Edge_Sobel()
{Mat img = imread("../ImageSet/wgj_1.jpg");if(img.empty()){cout<<"Read image failed"<<endl;return;}Mat img_resize;resize(img, img_resize, cv::Size(img.cols/4, img.rows/4),0.0,0.0, cv::INTER_LINEAR);imshow("Raw Image", img_resize);Mat dstImage, grad_x, grad_y;Sobel(img_resize, grad_x, CV_16S, 1, 0, 3, 1, 1);convertScaleAbs(grad_x, grad_x);imshow("X sobel", grad_x);Sobel(img_resize, grad_y, CV_16S, 0, 1, 3, 1, 1);convertScaleAbs(grad_y, grad_y);imshow("Y sobel", grad_y);addWeighted(grad_x, 0.5, grad_y, 0.5, 0, dstImage);imshow("Sobel", dstImage);
}

Sobel边缘检测效果:

1.4 Canny边缘检测算子

Canny边缘检测由三个主要目标形成:

  • 无附加响应的最优检测
  • 检测边缘位置和实际边缘位置之间距离最小的正确定位
  • 减少单边缘的多重响应而得到单响应

第一个目标是减少噪声响应,可以通过最优平滑处理来实现,一般用高斯滤波。第二个目标是正确性,可以通过非极大值抑制处理来实现;非极大值抑制的输出是正确位置上边缘点连成的细线。第三个目标限制是单个边缘点对于亮度变化的定位。

Canny算法一般分5步实现:

(1) 高斯模糊。主要作用是去除噪声,高斯模板的半径选择很重要,过大的半径容易模糊边缘,过小无法滤除噪声,OpenCV推荐使用5*5大小。

(2) 计算梯度幅度和方向。一般采用Sobel算子实现。

(3) 非极大值抑制。非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0。

非极大值抑制实质上是找到边缘强度数据中的最高点。它利用边缘方向信息来处理,验证所有点是否是峰值。假设有一个3*3区域,如果一个点两侧的梯度小于该点上的梯度,那么它为极大值。图1-5显示的是兴趣点Px,y的相邻点,在Px,y处的边缘方向以及Px,y处边缘方向的法线。如果梯度Px,y大于点M1和M2,那么点M(x,y)被标记为极大值。由于相邻点都是离散的,需要对M1和M2进行插值,利用Mx,My对其值进行一阶插值,得出:

(4) 双阈值检测。在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,必须用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素,可以通过选择高低阈值来实现。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。

(5) 滞后边界跟踪。到目前为止,被划分为强边缘的像素点已经被确定为边缘,因为它们是从图像中的真实边缘中提取出来的。然而,对于弱边缘像素,将会有一些争论,因为这些像素可以从真实边缘提取也可以是因噪声或颜色变化引起的。为了获得准确的结果,应该抑制由后者引起的弱边缘。通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。

OpenCV代码示例:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
using namespace std;
using namespace cv;
#define IMAGE_PATH  "../ImageSet/wgj_1.jpg"int main()
{Mat img = imread(IMAGE_PATH);if(img.empty()){cout<<"Read image failed"<<endl;return 0;}Mat img_resize;resize(img, img_resize, cv::Size(img.cols/2, img.rows/2),0.0,0.0, cv::INTER_LINEAR);imshow("Raw Image", img_resize);Mat dstImage, edge, grayImage;cvtColor(img_resize, grayImage, COLOR_BGR2GRAY);blur(grayImage, edge, Size(3,3));Canny(edge, edge, 5, 20, 3);imshow("Canny", edge);waitKey(0);
}

边缘提取效果如图1-6所示。

二. 二阶边缘检测算子

图像的亮度变化也可以用二阶导数表示,当信号变化比例最大时其值也最大,二阶导数的过零位置是一阶导数的峰值变化位置。

2.1 Laplacian算子

Laplacian算子是一个实现二阶微分的模板。二阶微分可以利用两个相邻一阶微分的差值来近似:

将水平二阶算子和垂直二阶算子结合起来可以得到全Laplacian模板。

将四邻点扩展到八邻点,可以得到图2-1 (c)中的模板。

将源图像和拉普拉斯图像叠加在一起的简单方法,可以复原背景特性并保持拉普拉斯锐化处理的效果。


OpenCV基础应用4.边缘检测相关推荐

  1. OpenCV基础之边缘检测与轮廓描绘

    文章目录 OpenCv基础之边缘检测与轮廓描绘 Canny边缘检测 图像轮廓 绘制轮廓 OpenCv基础之边缘检测与轮廓描绘 边缘检测:主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大) ...

  2. OpenCV基础入门【C++及python语言】

    OpenCV基础入门[C++语言] OpenCV-Python 中文教程 OpenCV官方教程中文版(For Python) OpenCV2-Python-Tutorials 部分文件参考: http ...

  3. OpenCV基础(基于Opencv4.4+VS2019)

    OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...

  4. OpenCV基础入门系列基本操作——贰

    系列博文第二篇,关于OpenCV4的一些基本操作和使用. 博文主要以实例展示不同的函数使用方法. OpenCV基础入门系列基本操作--壹 前言 下述为本博文需要用到的各类头文件以及全局变量等 读者可根 ...

  5. 如何使用OpenCV进行图像的边缘检测和边缘增强?

    OpenCV提供了几种常见的边缘检测算法,包括Sobel.Scharr.Laplacian和Canny等.这些算法可以帮助我们找到图像中的边缘并增强它们,以提取有用的特征或分割图像中的对象. 如何使用 ...

  6. PaddlePaddle领航团 OpenCV基础知识点总结

    PaddlePaddle领航团 OpenCV基础知识点总结 1.OpenCV基础 加载图片,显示图片,保存图片 OpenCV函数:cv2.imread(), cv2.imshow(), cv2.imw ...

  7. 【计算机视觉OpenCV基础】实验四 尺寸测量

    实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234+扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑: ...

  8. OpenCV入门系列 —— Sobel边缘检测

    OpenCV入门系列 -- Sobel边缘检测 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别.定位 ...

  9. python open-cv 基础知识总结(三)

    上一章:python open-cv 基础知识总结(二) 1. 轮廓中心计算 本教程的目标是 (1)  检测图像中每个形状的轮廓, (2)  计算轮廓的中心 -也称为区域的  质心 . 为了实现这些目 ...

最新文章

  1. python3安装cocos2d_(3)在Windows7上搭建Cocos2d-x
  2. [导入]使用RDLC报表(一)
  3. Instance and Media Recovery Structures
  4. 0027-如何在CDH集群启用Kerberos
  5. Spring boot 字符集编码
  6. JSP中forward和include的区别
  7. window下遍历并修改文件
  8. 逼急了自己人都坑,腾讯内部上演吃鸡大战
  9. Js toString()方法笔记
  10. 宝岛探险1(DFS)
  11. centos7查看设置IP地址
  12. 计算机一级考试图片水印怎么加,图片水印怎么添加?一起来看看这几个方法
  13. 40岁开始学python_37 岁了,想学习 Linux 和 Python ,不知道晚不晚。
  14. 怎么搭建微信小程序的本地测试服务器
  15. Live800:中小企业如何选择在线客服系统?
  16. 【Word】如何设置交叉引用标注参考文献与设置上标
  17. Socket编程中具体接口的用法
  18. mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
  19. 计算机考试重点题目与答案
  20. 达梦数据库定位阻塞方法举例

热门文章

  1. 7-4 单链表基本操作
  2. 必考题系列--十种常见的运行时异常
  3. 相对寻址方式与变址寻址方式的区别与联系
  4. 真正理解mybatis拦截器以及Interceptor和Plugin作用
  5. 微软 WP 手机刷机工具已恢复正常
  6. NoteExpress引用文献出现ADDIN NE.Ref.
  7. OpenCV-FLANN识别
  8. C语言字符串笔试题含答案
  9. WindML、FreeType和TrueType三者相结合实现矢量字体的显示
  10. 高性能处理器架构与编程实验(基础实验2:openEuler系统环境实验)