MATLAB的边缘检测函数中隐含的细化(非极大值抑制)算法
前段时间做了一个车牌检测识别的项目,我的任务是将MATLAB中的算法移植成C++代码。在车牌区域提取的过程中,用到了水平方向的Sobel算子检测垂直边缘,一开始我直接把MATLAB中的
bw = edge(I, 'sobel', 'vertical'); |
语句改写成OpenCV中的
cv::Mat sobel_kernel = (cv::Mat_<float>(3,3) << -0.125, 0, 0.125, |
之后,整个检测算法产生了一些意想不到的输出。追根溯源,我发现问题的根源就是在这个边缘检测步骤里:MATLAB的edge函数产生的是一个细化的二值边缘,而OpenCV中输出的是模板卷积后的浮点型的梯度值,若直接对其阈值化,将产生一个粗边缘,如下图所示(从左到右分别为edge函数输出边缘,OpenCV中直接使用Sobel算子及阈值化产生的边缘,原图)

研究了一下edge的实现代码,我发现这么一个函数

computeEdgesWithThinning函数实现了非极大值抑制和阈值化的效果,这个函数的实现方式已经被MATLAB封装,无法查看。一番波折之后,我模拟出一个效果基本一致的细化及阈值化算法(默认的阈值T为4乘以每个点梯度的模的平方的均值):
设 M(i, j) 为某点的梯度的模的平方
M(i, j) 大于阈值 T 且:
若 M(i, j) > M(i - 1, j) 且 M(i, j) > M(i + 1, j)
或者 M(i, j) > M(i, j - 1) 且 M(i, j) > M(i, j + 1)
则将输出边缘图像的 (i, j) 位置设为 1
简要地说,就是判断一个点的梯度是否是水平或者垂直方向的上的局部极大值,当然,梯度值首先得大于阈值。经过实验,加上这个非极大值抑制的步骤后,输出图片与MATLAB的edge函数产生的边缘图片基本一致,下面整个边缘检测加细化的MATLAB实现代码(只检测垂直的边缘)
function e = sobel_thin(img) |
MATLAB的边缘检测函数中隐含的细化(非极大值抑制)算法的更多相关文章
- 目标检测,主要问题发展,非极大值抑制中阈值也作为参数去学习更满足end2end,最近发展趋势和主要研究思路方向
目标检测,主要问题发展,非极大值抑制中阈值也作为参数去学习更满足end2end,最近发展趋势和主要研究思路方向 待办 目标检测问题时间线 特征金字塔加滑窗 对象框推荐 回归算法回归对象框 多尺度检测 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- 从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。
在matlab的图像处理工具箱中,有一系列关于Binary Images的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'.'branchpoints'.' ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...
- MATLAB如何定义函数
自定义函数的途径:M文件函数(M file function)在线函数(Inline Function)匿名函数(Anonymous Function)1.M文件函数范例function c=myad ...
- matlab画图形函数 semilogx
matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...
- Matlab.NET混编技巧之——找出Matlab内置函数
原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...
随机推荐
- 1、安装Scrapy
一.网址:https://doc.scrapy.org/en/latest/intro/install.html 二.安装过程中出现"cl.exe"找不到的错误,解决方法:http ...
- nodejs 简单的搭建一个服务器
前言: nodejs 主要是后台语言 node 是在终端运行的,所以他可以进行 dos 命令 模块 自定义 JavaScript 是前台语言 nodejs 是 也是使用我们的 JavaScript ...
- YV12和NV12格式
害怕搞忘 直接保存图片
- easyhook源码分析一
easyhook简要说明: easyhook是一个开源的hook库(http://easyhook.github.io/),其支持托管代码(.NET)和非托管代码(C/C++)hook,这里只分析了其 ...
- IFG以太网帧间隙
交换机的线速 描述交换机性能可以使用“线速”这个概念,那它是什么意思呢?所谓的线速是指经过交换机处理的理想状态下最大数据率.描述数据率可以用bps(bit per second)和mpps(milli ...
- centOS7杀死进程命令
查看当前所有正在运行的进程,可以看到80端口被httpd占用了(80端口希望分配给nginx使用,而不是httpd) netstat -tpnul 这里以杀死httpd进程为例: 先查看 httpd ...
- Stream介绍
一.Stream介绍 现在有这样的需求:有个菜单list,菜单里面非常多的食物列表,只选取小于400卡路里的并且按照卡路里排序,然后只想知道对应的食物名字. 代码: package com.cy.ja ...
- 阶段3 1.Mybatis_11.Mybatis的缓存_3 mybatis一对一实现延迟加载
不用骨架创建项目 复制一对多的代码src下的代码到我们刚才创建的项目里面 把依赖信息复制过来 这里原来实现的功能是立即加载的功能.sql语句是一次性查询的两个表关联的查询. 调整代码 删除Accoun ...
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_1 回顾Mybatis的环境搭建-实现查询所有功能
先回顾Mybits的环境搭建,. 直接next 直接点击finish 创建好的项目. 所有东西都自己写不现实,约束文件的头部还是拷贝过来 导入依赖坐标,Mybits mysql的驱动 log4j 单元 ...
- Linux(Ubuntu)常用命令 & vim基本操作
Linux先知: Linux历史: 关于这个我就不再多说了,其实是一个很有意思的故事串,网上找下一大堆. 类Unix系统目录结构: ubuntu没有盘符这个概念,只有一个根目录/,所有文件都在它下面 ...