在Canny算法中,对于其中的非极大值抑制这一点做笔记整理,过程看之前的这一片,注意理解里面的关于梯度相关的概念

原理如下:(需要理解)
依据当前点的周围点的梯度模来推算中心点的模,然后与实际值比较,若小则保留,若大于实际值则舍弃,在边缘检测中也有根据梯度模确定是否边缘,大于一定阈值就判定为是!
由中心点的梯度向量、周围点的梯度模,推断中心点的梯度模,再与实际值比较,梯度模就是梯度程度!

已知ax,ay,a1,a2,求Cm,如下:

用a0与cm,cm’比较确定是否舍弃a0,转90度再计算一次;
推导如上,下面来看一下代码:

在这里插入代码片
​        public static Bitmap NoNMaximumSupressionOri(this Bitmap sourceBitmap){double factor = 1;int[,] filterMatrixx = new int[3, 3] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };//in X directionint[,] YfilterMatrixy = new int[3, 3] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };//in Y directionif ((filterMatrixx.GetLength(0) & 1) == 0 || (filterMatrixx.GetLength(1) & 1) == 0 || filterMatrixx.GetLength(0) != filterMatrixx.GetLength(1))return null;double[,] data = ToGrayBufferD<double>(sourceBitmap);int height = data.GetLength(0);int width = data.GetLength(1);int filterOffset = (filterMatrixx.GetLength(1) - 1) / 2;double[,] dx = new double[height, width];double[,] dy = new double[height, width];double[,] dxy = new double[height, width];double[,] mag = new double[height, width];double[,] output = new double[height, width];unsafe{int toffset = filterOffset * width;fixed (double* source = data, pdx = dx, pdy = dy, pdxy = dxy, pm = mag){double* src = source + toffset, Dx = pdx + toffset, Dy = pdy + toffset, Dxy = pdxy + toffset, Dm = pm + toffset;double a11, a12, a13, a21, a23, a31, a32, a33, h, v;for (int i = filterOffset; i < height - filterOffset; i++){src += filterOffset;Dx += filterOffset;Dy += filterOffset;Dxy += filterOffset;Dm += filterOffset;for (int j = filterOffset; j < width - filterOffset; j++, src++, Dx++, Dy++, Dxy++, Dm++){a11 = src[+width + 1]; a12 = src[+1]; a13 = src[-width + 1];a21 = src[+width + 0]; /*  a22    */  a23 = src[-width + 0];a31 = src[+width - 1]; a32 = src[-1]; a33 = src[-width - 1];h = ((a11 + a12 + a13) - (a31 + a32 + a33)) * 0.166666667f;v = ((a11 + a21 + a31) - (a13 + a23 + a33)) * 0.166666667f;*Dx = h;*Dy = v;*Dxy = h * v;*Dm = Math.Sqrt((*Dx * *Dx) + (*Dy * *Dy));}src += filterOffset;Dx += filterOffset;Dy += filterOffset;Dxy += filterOffset;Dm += filterOffset;}}double a1, a2, b1, b2, A, B, point, val, max = 0;int cdx, cdy;fixed (double* pdx = dx, pdy = dy, pm = mag, pout = output){double* Dx = pdx + toffset, Dy = pdy + toffset, Dout = pout + toffset, Dm = pm + toffset;for (int i = filterOffset; i < height - filterOffset; i++){Dout += filterOffset;Dx += filterOffset;Dy += filterOffset;Dm += filterOffset;for (int j = filterOffset; j < width - filterOffset; j++, Dx++, Dy++, Dm++, Dout++){cdx = *Dx > 0 ? 1 : -1;cdy = *Dy > 0 ? 1 : -1;if (Math.Abs(*Dx) > Math.Abs(*Dy)){a1 = Dm[cdx];a2 = Dm[cdx - cdy * width];b1 = Dm[-cdx];b2 = Dm[-cdx + cdy * width];A = (Math.Abs(*Dx) - Math.Abs(*Dy)) * a1 + Math.Abs(*Dy) * a2;B = (Math.Abs(*Dx) - Math.Abs(*Dy)) * b1 + Math.Abs(*Dy) * b2;point = *Dm * Math.Abs(*Dx);if (point >= A && point > B)*Dout = Math.Abs(*Dx);else*Dout = 0;}else{a1 = Dm[-cdy * width];a2 = Dm[cdx - cdy * width];b1 = Dm[cdy * width];b2 = Dm[-cdx + cdy * width];A = (Math.Abs(*Dy) - Math.Abs(*Dx)) * a1 + Math.Abs(*Dx) * a2;B = (Math.Abs(*Dy) - Math.Abs(*Dx)) * b1 + Math.Abs(*Dx) * b2;point = *Dm * Math.Abs(*Dy);if (point >= A && point > B)*Dout = Math.Abs(*Dy);else*Dout = 0;}if (*Dout > max)max = *Dout;}Dout += filterOffset;Dx += filterOffset;Dy += filterOffset;Dm += filterOffset;}}double ratio = 255 / max;fixed (double* pout = output){double* Dout = pout + toffset;for (int i = filterOffset; i < height - filterOffset; i++){Dout += filterOffset;for (int j = filterOffset; j < width - filterOffset; j++, Dout++){*Dout *= ratio;}Dout += filterOffset;}}}Bitmap resultBitmap = GetBmpFromArray<double>(output);return resultBitmap;}​

这里做简要解释:

代码附上,下载学习

C#图像处理程序实现--Canny实现 笔记整理(其中的非极大值抑制点)相关推荐

  1. 深度学习笔记(38) 非极大值抑制

    深度学习笔记(38) 非极大值抑制 1. 对象多次检测问题 2. 非极大值抑制 3. 独立性 1. 对象多次检测问题 到目前为止学到的对象检测中的一个问题是,算法可能对同一个对象做出多次检测 所以算法 ...

  2. C++自定义非极大值抑制(Canny边缘检测,亚像素方法)

    Mat subPixleRestrainNoMax2(Mat img)//具有更清楚的物理解释,线插分法 {Mat oriImage = img;Mat newImage_x = Mat(img.si ...

  3. Canny算法中的非极大值抑制

    在canny边缘检测算法中,为了检测边缘,其中会用到非极大值抑制的原理.其基本思想如下: 其目的就是寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点. 其中蓝色 ...

  4. 计算机视觉入门-梯度、算子、Canny边缘检测、非极大值抑制、双门限法

    第二章 边缘检测 边缘:信号突变的地方.能够紧凑描述图片的内容信息 边缘检测的几种类型: 表面不连续 深度不连续 表面颜色不连续 投影不连续 可以根据求导来判断是否为断点(边缘) x方向(为简便操作 ...

  5. 图像卷积下非极大值抑制 Sobel 的实现

    bool sobelOptaEdge(const cv::Mat& srcImage, cv::Mat& resultImage, int flag) {CV_Assert(srcIm ...

  6. 图像非极大值抑制 Sobel 边缘实现

    bool SobelVerEdge(cv::Mat srcImage, cv::Mat& resultImage) {CV_Assert(srcImage.channels() == 1);s ...

  7. 吴恩达神经网络和深度学习-学习笔记-44-交并比IoU + 非极大值抑制

    交并比IoU--衡量定位精确度 在对象检测任务中,我们希望能够同时定位对象. 人们定义IoU这个概念,是为了评价你的对象定位算法是否精准,但更一般地说,IoU衡量了两个边界框重叠的相对大小. 如果实际 ...

  8. Opencv学习笔记(二十六)文本检测mser+非极大值抑制nms

    文章目录 mser检测 nms非极大值抑制 代码 mser检测 nms非极大值抑制 代码 import cv2 import matplotlib.pyplot as plt import numpy ...

  9. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

最新文章

  1. CSS样式学习-CSS 背景
  2. JAVA8 获取叶节点_Java找出所有的根节点到叶子节点的节点值之和等于sum 的路径...
  3. lunix系统安装及分区补充安装包
  4. SequoiaDB 系列之五 :源码分析之main函数
  5. 新一代消息队列 Pulsar
  6. oracle插入数据语句实例,oracle Insert 用法总结
  7. 信息学奥赛C++语言:输出判断
  8. c++调用python原理_C++调用Python浅析
  9. java web 数据库操作_Java Web----Java Web的数据库操作(三)
  10. SQL中LIMIT子句介绍
  11. 重庆计算机一级考试在线做,全国(重庆考区)计算机一级考试教程.doc
  12. http协议(九)响应首部字段
  13. 双轨制直销软件功能介绍
  14. php应用CPU使用率100%解决思路
  15. Android 网络图片加载之cude 框架
  16. 利用python爬取租房信息网_Python3爬虫实战:以爬取小猪短租租房信息为例
  17. 使用同花顺获取单只股票的所有历史日线数据
  18. 22考研杭师管理科学与工程专业368分经验贴(Python141+政治80+日语71,含数政专书籍与免费课程资源推荐)
  19. 三校生计算机教学计划,第十二
  20. 树莓派无线鼠标不灵敏问题安装输入法

热门文章

  1. cubase怎么添加midi设备_教你解决Cubase拔出USB-MIDI设备后不能再识别的问题。
  2. 计算机专业文献阅读报告,研究生文献阅读课程的报告撰写基本要求
  3. [latex]在箭头上写东西,写字
  4. 使用rem实现响应式布局
  5. 视觉开发 学习 参考课本_D3的视觉参考
  6. 畅言单点登录php代码,畅言 - 帮助 - wordpress单点登录教程
  7. 关闭贱贱的window10的自动更新系统
  8. 比特元BTY入驻区分平台
  9. 数控车床纵向进给系统设计CAD图与说明书 伺服 课程设计
  10. Pi Hybrids问题