在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. Linux设备驱动程序 第三版 读书笔记(一)
  2. Spring Boot + Vue 前后端分离,两种文件上传方式总结
  3. 数字时钟设计verilog_数字IC设计基本概念之创建时钟
  4. 代码更换ui图片_不同人眼中的UI设计师都是什么样的?
  5. HTML5 figure元素
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (19) - 系统代理
  7. 新版Fiddler1.5.1的证书导出和Chrome,Edge,Firefox浏览器导入证书
  8. 拍拍抢拍精灵v2.1秒杀器所有源代码【开源】
  9. 人力资源管理案例选读【2】
  10. 20071020ー胡小蝶
  11. js中三大特殊数据underfined,null,NaN
  12. 安装软件,python安装,node.js安装,pycharm安装,vscode安装,PR, PS, LR.AE Windows开关机等,雪崩的时候没有一片雪花儿是无辜的
  13. HTPC改装19寸2U轻量级机架PC
  14. 计算机常用英语词汇表
  15. 计算机视觉到底需要学什么?怎么快速入门?
  16. 【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关
  17. ERD Online 元数据管理开放平台
  18. 美法官:甲骨文与谷歌专利诉讼无法和解
  19. latex遇到重复的作者有波折号省略问题
  20. IO流——高级(2)

热门文章

  1. 通俗讲解哈希表,哈希碰撞问题!
  2. 2023 一花卡密管理系统源码
  3. dump文件 修复iat_在OD中手工修复IAT重定向
  4. 移动电影院新升级,特色垂直社交功能有望制造10亿块银幕
  5. 在WORD中画流程图,如何微调箭头及在箭头上写字?
  6. 身处微信小程序红海,如何才能防止“溺亡”?
  7. 基于STM32单片机温湿度一氧化碳(CO)浓度仿真设计
  8. 有关UDP校验和、循环冗余检测(CRC)的计算
  9. JavaScript 别踩白块
  10. java实现第三届蓝桥杯拼音字母