canny算子的边缘提取算法
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算子的边缘提取算法相关推荐
- c#用canny算子做边缘提取_【图像处理】边缘检测
边缘检测 sobel sobel是最常见也是最常用的边缘检测算子.一般来说,当我们想要获取图像的边缘时,首先想到的就是像素值发生突变的位置,而如何用数学表达来刻画"突变",一个很好 ...
- c#用canny算子做边缘提取_机器视觉学习(三)边缘检测
一.边缘检测 二.边缘检测流程 三.Canny边缘检测 前言 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域.有许多方法用于边缘检测,它们的绝大部分可以划分为两类: 基于一阶导数 首 ...
- canny算子_Canny边缘检测算法
PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路. 1.问题描述 在计算机视觉/机器视觉领域,图像分割的应用十分普遍 ...
- c#用canny算子做边缘提取_干货 | 边缘检测
最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...
- 边缘检测Sobel、laplacian、canny算子
1.图像边缘检测 图像边缘检测对于分析图像中的内容.实现图像中物体的分割.定位等具有重要的作用.边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性.常用的图像边缘检测 ...
- 图像处理:边缘提取算法(边缘提取算子总结)——Matlab代码实现
边缘提取算子 一阶: Roberts算子.Sobel算子.Prewitt算子.Kirsch算子.Robinson算子 二阶: Laplacian算子.Canny算子.Marr-Hildreth(Lo ...
- 数字图像处理---LOG算子和CANNY算子边缘提取(matlab)
LOG算子和CANNY算子边缘提取 边缘的含义: 在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色 ...
- 改进的sobel算法和色调信息的叶脉提取 c语言,基于窗口动态阈值改进Canny算子的叶脉提取算法的制作方法...
本发明涉及一种基于Canny算子的叶脉提取算法,尤其涉及一种基于窗口动态阈值改进Canny算子的叶脉提取算法,属于计算机视觉技术领域. 背景技术: 叶脉提取,是指从不同形状.摆放的叶脉图像中,利用计算 ...
- 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)
目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...
最新文章
- UA MATH567 高维统计II 随机向量6 亚高斯随机向量的应用: 半正定规划
- stm32 窗口看门狗学习(二)
- jsp无法解析java方法_Spring无法解析JSP视图
- SpringBoot异常处理-@ControlleAdvice
- Qt编写自定义控件及插件的使用
- java方法区对象类型_浅谈Java内存区域与对象创建过程
- kinect在openni下也能玩抠出人物换背景
- iOS开发证书和配置文件的使用
- 多线程并发-java内存模型和计算机基础
- java当前时间查询,Java实现查询记录的时间相对于当前时间
- Liunx 常用命令
- 易筋SpringBoot 2.1 | 第廿六篇:SpringBoot访问缓存抽象Cache
- ISCW实验11:使用SDM配置Site-to-Site IPSec ×××
- 数字藏品文博周将至,拙政园主题数字藏品全网首发
- 生产订单的计划、实际成本与产出查看
- Android文件实现选择打开方式
- App设计的基本原则和规范
- springboot 单点登录
- python mock patch_偷梁换柱:使用mock.patch辅助python单元测试
- 使用VGG-19模型训练自己的数据集