边缘检测原理

图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值的变化趋势可以用函数的导数描述。当函数值突然变大时,导数也必然会变大,而函数值变化较为平缓区域,导数值也比较小,因此可以通过寻找导数值较大的区域去寻找函数中突然变化的区域,进而确定图像中的边缘位置。图给出一张含有边缘的图像,图像每一行的像素灰度值变化可以用图中下方的曲线表示。

通过像素灰度值曲线可以看出图像边缘位于曲线变化最陡峭的区域,对灰度值曲线求取一阶导数可以得到图中所示的曲线,通过曲线可以看出曲线的最大值区域就是图像中的边缘。

由于图像是离散的信号,我们可以用临近的两个像素差值来表示像素灰度值函数的导数,求导形式可以用式来表示。

图像的边缘有可能是由高像素值变为低像素值,也有可能是由低像素值变成高像素值,通过式得到的正数值表示需要像素值突然由低变高,得到的负数值表示像素值由高到低,这两种都是图像的边缘,因此为了在图像中同时表示出这两种边缘信息,需要将计算的结果求取绝对值。

OpenCV 中提供了convertScaleAbs()函数用计算矩阵中所有数据的绝对值

void convertScaleAbs(InputArray src, OutputArray dst,double alpha = 1, double beta = 0);
  • src:输入矩阵。
  • dst:计算绝对值后输入矩阵。
  • alpha:缩放因子,默认参数为只求取绝对值不进行缩放。
  • beta:在原始数据上添加的偏值,默认参数表示不增加偏值。

该函数可以求取矩阵中所有数据的绝对值。函数前两个参数分别为输入、输出矩阵,两个参数可以是相同的变量。函数第三个和第四个参数为对绝对值的缩放和原始数据上的偏移。

图像的边缘包含X方向的边缘和Y方向的边缘,因此分别求取两个方向的边缘后,对两个方向的边缘求取并集就是整幅图像的边缘,即将图像两个方向边缘结果相加得到整幅图像的边缘信息

简单示例

//
// Created by smallflyfly on 2021/6/15.
//#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "utils.hpp"#include <iostream>using namespace std;
using namespace cv;int main() {Mat im = imread("test.jpg", IMREAD_GRAYSCALE);if (im.empty()) {cerr << "image file read error" << endl;return -1;}resize(im, im, Size(0,0), 0.5, 0.5);Mat kernel1 = (Mat_<float>(1, 2) << 1, -1);Mat kernel2 = (Mat_<float>(1, 3) << 1, 0, -1);Mat kernel3 = (Mat_<float>(3, 1) << 1, 0, -1);Mat kernelXY = (Mat_<float>(2, 2) << 1, 0, 0, -1);Mat kernelYX = (Mat_<float>(2, 2) << 0, -1, 1, 0);// 边缘检测Mat result1, result2, result3, resultXY, resultYX;// 检测水平方向边缘filter2D(im, result1, -1, kernel1);convertScaleAbs(result1, result1);// 检测水平方向边缘filter2D(im, result2, -1, kernel2);convertScaleAbs(result2, result2);// 检测垂直方向边缘filter2D(im, result3, -1, kernel3);convertScaleAbs(result3, result3);// 整幅图像的边缘Mat result23 = result2 + result3;// 检测左上到右下的边缘filter2D(im, resultXY, -1, kernelXY);convertScaleAbs(resultXY, resultXY);// 检测右上到左下的边缘filter2D(im, resultYX, -1, kernelYX);convertScaleAbs(resultYX, resultYX);Mat resultXYYX = resultXY + resultYX;showImage("result1", result1);showImage("result2", result2);showImage("result3", result3);showImage("result23", result23);showImage("resultXY", resultXY);showImage("resultYX", resultYX);showImage("resultXYYX", resultXYYX);waitKey(0);destroyAllWindows();return 0;}

结果图

OpenCV——边缘检测原理相关推荐

  1. opencv学习笔记18:canny算子边缘检测原理及其函数使用

    canny边缘检测原理 去噪:边缘检测容易受到噪声的影响,在此之间,先去噪,通常采用高斯滤波器.opencv学习笔记11:图像滤波(均值,方框,高斯,中值) 梯度:对去噪后的图像采用sobel算子计算 ...

  2. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  3. OpenCV学习-P34-P38 Opencv边缘检测

    OpenCV学习-P34-P37 Opencv边缘检测 Sobel检测算子 Laplacian检测算子 Canny边缘检测算法 边缘检测总结 边缘检测分为两类:基于搜索和基于零穿越 基于搜索:寻找图像 ...

  4. Canny边缘检测原理及C#程序实现

    原文:Canny边缘检测原理及C#程序实现 Canny边缘检测是被公认的检测效果最好的边缘检测方法,是由John F. Canny于1986年提出,算法目标是找出一个最优的边缘检测的方法,所谓最优即: ...

  5. opencv配置原理

    这里写自定义目录标题 opencv配置原理 opencv配置原理 今天看到了一篇很好的讲opencv与cmake关系的博客,以及为什么在VS里面配置opencv或者其他库需要路径包含及引用关系,及他们 ...

  6. Opencv边缘检测、轮廓发现、绘制轮廓

    Opencv边缘检测.轮廓发现.绘制轮廓 提取图像轮廓的2个步骤 1. findContours函数找轮廓, 2. drawContours函数画轮廓 轮廓的查找--cv::findContours( ...

  7. 十字交叉型染色体通过Opencv 分割原理

    十字交叉型染色体通过Opencv 分割原理 第一步:找到十字交叉型染色体的凹点 第二步:根据凹点和轮廓绘制单挑染色体的像素点. 第三步:根据像素点取出单挑染色体 第五步:对于特殊的十字交叉染色体,凹点 ...

  8. 【canny边缘检测】canny边缘检测原理及代码详解

    文章目录 前言 canny边缘检测算法主要流程 一.高斯模糊 二.图像梯度计算 三.非极大值抑制 四.双阈值边界跟踪 前言 本文通过介绍canny边缘检测原理与代码解析,希望能让大家深入理解canny ...

  9. 【OpenCV 4开发详解】边缘检测原理

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 记录一次没有收集直方图优化器选择全表扫描导致CPU耗尽
  2. Linux imooc learning
  3. CSS盒子模型之CSS3可伸缩框属性(Flexible Box)
  4. 2.1 进行误差分析-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  5. linux下安装 配置 redis数据库
  6. CSS :before :after 伪类选择器
  7. KMS安装后激活机器
  8. tankwar的java坦克子弹撞墙_tankwar
  9. 查找工资前三高的员工
  10. 程序员技术测评平台,猿圈宣布获智联数千万 A+轮战略融资
  11. could not be installed at this time
  12. 昆仑通态通用版找不到驱动_昆仑通态USB下载问题解决方案
  13. aix服务器文件名乱码,java aix 文件名乱码
  14. 【Jectpack】DataStore
  15. stm32 /*定时器ETR外部时钟初始化配置
  16. CE-FPN: Enhancing Channel Information for Object Detection
  17. 计算机网络:网络传输介质
  18. CSS3炫酷发光文字 ,自定义色彩
  19. acm-(辗转相除法、丢番图方程)2020 China Collegiate Programming Contest Qinhuangdao Site I. Interstellar Hunter
  20. 基于局部自适应色差阈值的彩色图像边缘检测_爱学术

热门文章

  1. bert中的sep_最强NLP模型BERT可视化学习
  2. [从零开始]用python制作识图翻译器·一
  3. 关于微信刷票会被发现吗及活动主办方防止微信投票刷票行为的一些思考
  4. python编程语法教程-Python编程基础语法快速入门
  5. DA14580笔记(2)-------睡眠状态下按键唤醒
  6. Ubuntu18.04安装部署GitLab-ce(HTTP/HTTPS访问,SAML配置)附:docker gitlab-ce部署
  7. 2023年浏览器哪个好用速度快,看这一篇就够了
  8. Python 高斯拟合
  9. 计算机控制的电冰箱,详解电脑控制型电冰箱维修基础
  10. 【运维面试】谈谈你对CDN的了解