canny算子边缘提取分为四个步骤

1、去噪:

利用高斯滤波对图像卷积进行去噪处理;

2、求梯度:

采用梯度滤波模板对图像进行卷积,求取图像X方向和Y方向的梯度,以及对应的夹角;

3、非极大值抑制:

将各像素的梯度模值与梯度方向上相邻两个像素进行比较,保留梯度为极大值点的像素灰度;

算法设计

算法目标:完成像素梯度方向相邻两点的梯度比较。

方式:C点梯度一致,dTemp1和dTemp2梯度未知,采用相邻像素梯度,通过插值求得dTemp1和dTemp2的梯度,进行比较。

方法:根据C点的梯度角度确定相邻像素,通过相邻像素进行插值得到dTemp的梯度。

1、首先需要选取插值像素g1,g2,再选取插值比例K。

参数设定依据,尽量选择一致的不随条件改变的规则,简化算法。

2、插值比例K与C点斜率相关,tanU=dx/dy——K=短边/长边,tanU与K存在条件转换关系

插值比例与斜率的条件转换关系

1、以角度45°,90°,135°,180°作为边界判断条件。

<45°,tanU=dx/dy=K

45°<U<90°,tanU=dx/dy=1/K

90°<U<135°,tanU=dx/dy=-1/K

135°<U<180°,tanU=dx/dy=-K

2、以K=短边/长边

tanU=dx/dy

abs(dx)?abs(dy):比较大小

K=小/大

第二种方法不需要判断条件,这是取决于斜率=dx/dy;插值比例是短边占整边的比例(等价于占长边的比例)所以只需要在斜率中提取出短长边的比值信息即可。

3、插值规则:temp=g1*K+g2*(1-K),g1是对角像素,g2是轴向像素

插值像素选取依据:

g1是对角像素,g2是轴向像素,g1,g2的定义源于插值条件,但对角和轴向是相对于C点的抽象的概念,当C点的斜率不相同时,对角和轴向对应不同的坐标,计算机无法自动识别,所以需要将不同情况下的坐标赋值给g1,g2。

继承长短边的判断条件:

当dx是长边,代表斜率距x轴更近,当dx,dy同号在第一三象限,g1=C(x+1,y+1),g2=C(x+1,y),反之在二四象限g1=C(x-1,y-1),g2=C(x-1,y)

当dy是长边,代表斜率距y轴更近,当dx,dy同号在第一三象限,g1=C(x+1,y+1),g2=C(x,y+1),反之在二四象限g1=C(x-1,y-1),g2=C(x,y-1)

象限问题和网上搜的程序有出入,还望大佬们帮我指出问题。

canny算子及边缘提取原理_jiachen0212的博客-CSDN博客_canny算子阈值怎么取

边缘检测(Edge Detection)_长江之声的博客-CSDN博客_边缘测试

void NonMaxSuppress(int*pMag,int* pGradX,int*pGradY,SIZE sz,LPBYTE pNSRst)
{  LONG x,y;  int nPos;  // the component of the gradient   int gx,gy;  // the temp varialbe   int g1,g2,g3,g4;  double weight;  double dTemp,dTemp1,dTemp2;  //设置图像边缘为不可能的分界点   for(x=0;x<sz.cx;x++)  {  pNSRst[x] = 0;  pNSRst[(sz.cy-1)*sz.cx+x] = 0;  }  for(y=0;y<sz.cy;y++)  {  pNSRst[y*sz.cx] = 0;  pNSRst[y*sz.cx + sz.cx-1] = 0;  }  for (y=1;y<sz.cy-1;y++)  {  for (x=1;x<sz.cx-1;x++)  {  nPos=y*sz.cx+x;  // if pMag[nPos]==0, then nPos is not the edge point   if (pMag[nPos]==0)  {  pNSRst[nPos]=0;  }  else  {  // the gradient of current point   dTemp=pMag[nPos];  // x,y 方向导数   gx=pGradX[nPos];  gy=pGradY[nPos];  //如果方向导数y分量比x分量大,说明导数方向趋向于y分量,即更贴近y轴   if (abs(gy)>abs(gx))  {  // calculate the factor of interplation   weight=fabs(gx)/fabs(gy);  g2 = pMag[nPos-sz.cx];  // 确定g2出现在c(中心点)的上一行   g4 = pMag[nPos+sz.cx];  // 确定g4出现在c(中心点)的下一行   //C 为当前像素,与g1-g4 的位置关系为:   //g1 g2   //   C   //   g4 g3   if(gx*gy>0) //如果x,y两个方向导数的符号相同  {  g1 = pMag[nPos-sz.cx-1];  g3 = pMag[nPos+sz.cx+1];  }   //对的,画个图可以很好的理解。 左上角为原点,x,y导数相同即导数线跨越2 4象限 如上图1                     //如果x,y两个方向的方向导数方向相反   //C是当前像素,与g1-g4的关系为:   //    g2 g1   //    C   // g3 g4   else  //左上角为原点,x,y导数相反即导数线跨越1 3象限  如上图2{  g1 = pMag[nPos-sz.cx+1];  g3 = pMag[nPos+sz.cx-1];  }  }  else  {  //插值比例   weight = fabs(gy)/fabs(gx);                   g2 = pMag[nPos+1]; //后一列   g4 = pMag[nPos-1];  // 前一列                 //如果x,y两个方向的方向导数符号相同   //当前像素C与 g1-g4的关系为   // g3   // g4 C g2   //       g1   if(gx * gy > 0)  {  g1 = pMag[nPos+sz.cx+1];  g3 = pMag[nPos-sz.cx-1];  }  //如果x,y两个方向导数的方向相反   // C与g1-g4的关系为   // g1   // g4 C g2   //      g3   else  {  g1 = pMag[nPos-sz.cx+1];  g3 = pMag[nPos+sz.cx-1];  }  }  dTemp1 = weight*g1 + (1-weight)*g2;  dTemp2 = weight*g3 + (1-weight)*g4;               //当前像素的梯度是局部的最大值   //该点可能是边界点   if(dTemp>=dTemp1 && dTemp>=dTemp2)  {  pNSRst[nPos] = 128;  }  else  {  //不可能是边界点   pNSRst[nPos] = 0;  }             }  }  }
}  

4、双阈值绘制边缘:

以高阈值提取出的边缘为主边缘,在边缘残缺部分补充与主边缘相连接的低阈值边缘,最终构成完整的边缘信息。

这个先挖坑,后边再补。

5、算法设计思路总结:

首先清楚算法的目标,以及想要实现的方式。

细化方法:

将方法中的每一个对象,进行具体定位;

考虑全所有的情况,进行对象在不同条件下的行为匹配;

将对象所要实施的行为进行细化拆解,转化为电脑可理解的,可实行的基础动作;

整合简化判断条件,变量规则一致化设置,起到简化算法的效果。

如果我的博文有帮到你,请点赞给我加油呀,也谢谢在解决问题过程中参考的诸位大佬们啦~

canny算子的边缘提取算法相关推荐

  1. c#用canny算子做边缘提取_【图像处理】边缘检测

    边缘检测 sobel sobel是最常见也是最常用的边缘检测算子.一般来说,当我们想要获取图像的边缘时,首先想到的就是像素值发生突变的位置,而如何用数学表达来刻画"突变",一个很好 ...

  2. c#用canny算子做边缘提取_机器视觉学习(三)边缘检测

    一.边缘检测 二.边缘检测流程 三.Canny边缘检测 前言 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域.有许多方法用于边缘检测,它们的绝大部分可以划分为两类: 基于一阶导数 首 ...

  3. canny算子_Canny边缘检测算法

    PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路. 1.问题描述 在计算机视觉/机器视觉领域,图像分割的应用十分普遍 ...

  4. c#用canny算子做边缘提取_干货 | 边缘检测

    最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...

  5. 边缘检测Sobel、laplacian、canny算子

    1.图像边缘检测 图像边缘检测对于分析图像中的内容.实现图像中物体的分割.定位等具有重要的作用.边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性.常用的图像边缘检测 ...

  6. 图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现

    边缘提取算子 一阶:  Roberts算子.Sobel算子.Prewitt算子.Kirsch算子.Robinson算子 二阶: Laplacian算子.Canny算子.Marr-Hildreth(Lo ...

  7. 数字图像处理---LOG算子和CANNY算子边缘提取(matlab)

    LOG算子和CANNY算子边缘提取 边缘的含义: 在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色 ...

  8. 改进的sobel算法和色调信息的叶脉提取 c语言,基于窗口动态阈值改进Canny算子的叶脉提取算法的制作方法...

    本发明涉及一种基于Canny算子的叶脉提取算法,尤其涉及一种基于窗口动态阈值改进Canny算子的叶脉提取算法,属于计算机视觉技术领域. 背景技术: 叶脉提取,是指从不同形状.摆放的叶脉图像中,利用计算 ...

  9. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

最新文章

  1. UA MATH567 高维统计II 随机向量6 亚高斯随机向量的应用: 半正定规划
  2. stm32 窗口看门狗学习(二)
  3. jsp无法解析java方法_Spring无法解析JSP视图
  4. SpringBoot异常处理-@ControlleAdvice
  5. Qt编写自定义控件及插件的使用
  6. java方法区对象类型_浅谈Java内存区域与对象创建过程
  7. kinect在openni下也能玩抠出人物换背景
  8. iOS开发证书和配置文件的使用
  9. 多线程并发-java内存模型和计算机基础
  10. java当前时间查询,Java实现查询记录的时间相对于当前时间
  11. Liunx 常用命令
  12. 易筋SpringBoot 2.1 | 第廿六篇:SpringBoot访问缓存抽象Cache
  13. ISCW实验11:使用SDM配置Site-to-Site IPSec ×××
  14. 数字藏品文博周将至,拙政园主题数字藏品全网首发
  15. 生产订单的计划、实际成本与产出查看
  16. Android文件实现选择打开方式
  17. App设计的基本原则和规范
  18. springboot 单点登录
  19. python mock patch_偷梁换柱:使用mock.patch辅助python单元测试
  20. 使用VGG-19模型训练自己的数据集

热门文章

  1. html前端使用腾讯地图入门教学:在地图上标记位置
  2. Google官网,Google android的产品线(important)
  3. [笔记]松散四叉树,BVH,BSP,KD树的特性以及适用情况
  4. odoo postman测试odoo接口
  5. 改脸型先要了解脸型结构
  6. ESP8266基础详细使用
  7. 软件测试能做到多少岁?出路在哪里?
  8. 把把几十杀?终于知道为什么主播玩吃鸡都那么厉害了
  9. 刚拿到护照,第一次出国应该从哪些国家开始?
  10. 前端生成二维码并下载(PC端)