前段时间做了一个车牌检测识别的项目,我的任务是将MATLAB中的算法移植成C++代码。在车牌区域提取的过程中,用到了水平方向的Sobel算子检测垂直边缘,一开始我直接把MATLAB中的

bw = edge(I, 'sobel', 'vertical');

语句改写成OpenCV中的

cv::Mat sobel_kernel = (cv::Mat_<float>(3,3) << -0.125, 0, 0.125,
-0.25, 0, 0.25,
-0.125, 0, 0.125);
cv::Mat edges;
cv::filter2D(gray_img, edges, gray_img.type(), sobel_kernel);

之后,整个检测算法产生了一些意想不到的输出。追根溯源,我发现问题的根源就是在这个边缘检测步骤里: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)
op = fspecial('sobel') / 8;
x_mask = op';
a = im2double(img);
scale = 4;
bx = imfilter(a,x_mask,'replicate');
b = bx.*bx;
cutoff = 4 * mean2(b);
[m, n] = size(b);
 
for r = 1 : m
for c=1 : n
if ((c - 1) < 1)
b1 = true;
else
b1 = (b(r, c - 1) <= b(r, c));
end
if (c + 1) > n
b2 = true;
else
b2 = (b(r, c) > b(r, c + 1));
end
if ((r - 1) < 1)
b3 = true;
else
b3 = (b(r - 1, c) <= b(r, c));
end
if ((r+1) > m)
b4 = true;
else
b4 = (b(r, c) > b(r + 1, c));
end
e(r, c) = (b(r, c) > cutoff) & ((b1 & b2) | (b3 & b4));
end
end

MATLAB的边缘检测函数中隐含的细化(非极大值抑制)算法的更多相关文章

  1. 目标检测,主要问题发展,非极大值抑制中阈值也作为参数去学习更满足end2end,最近发展趋势和主要研究思路方向

    目标检测,主要问题发展,非极大值抑制中阈值也作为参数去学习更满足end2end,最近发展趋势和主要研究思路方向 待办 目标检测问题时间线 特征金字塔加滑窗 对象框推荐 回归算法回归对象框 多尺度检测 ...

  2. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  3. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  4. 从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

    在matlab的图像处理工具箱中,有一系列关于Binary Images的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'.'branchpoints'.' ...

  5. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  6. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  7. MATLAB如何定义函数

    自定义函数的途径:M文件函数(M file function)在线函数(Inline Function)匿名函数(Anonymous Function)1.M文件函数范例function c=myad ...

  8. matlab画图形函数 semilogx

    matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...

  9. Matlab.NET混编技巧之——找出Matlab内置函数

    原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...

随机推荐

  1. html初体验#1

    html的一些自见解 html 5 自带语义化,就是让标签带上感情色彩,方便人或浏览器区分 <b></b>与<strong></strong>的区别 & ...

  2. linux 设置 hugepage

    临时设置 hugepage > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages 查看是否设置成功 cat /proc/meminf ...

  3. TiDB官方文档

    TiDB官方文档: https://github.com/pingcap/docs-cn TiDB 整体架构 TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiK ...

  4. Java基础之comparator和comparable的区别以及使用

    Java基础之comparator和comparable的区别以及使用 1: 区别:  .Comparable类需要实现此接口,定义在类内,不利于扩展 2 .Comparator更灵活,可以随时自定义 ...

  5. vue 表格组件分享

    分享一款自己写的table组件  用起来还算简单好用   (先介绍使用方法(ts版本的)) 引入组件不多说 import jTable from '../comp/comp/table/table.v ...

  6. C# WinForm开发系列学习 地址 很详细

    http://www.cnblogs.com/peterzb/archive/2009/07/27/1531910.html

  7. case when then else end 累加

    表结构 id(pk) satisfy(满意,一般,不满意) 一条语句查询 总数 各satisfy总数 SELECT count(*) AS 总数, count( CASE satisfy WHEN ' ...

  8. 使用cesium中的scene.open中遇到的几个问题

    有些服务是发在场景(scene)下的,超图提供了一个很方便的方法:scene.open,这个方法会将场景中所有的图层(无论是OSGB还是影像和地形)加载进来.同时这个方法会自带一个自动地位功能,具体实 ...

  9. Linux iptables 防火墙常用规则

    iptables 安装 yum install iptables iptables 规则清除 iptables -F iptables -X iptables -Z 开放指定的端口允许本地回环接口(即 ...

  10. Django 实现分库

    网站后端的数据库随着业务的不断扩大,用户的累积,数据库的压力会逐渐增大.一种办法是优化使用方法,也就是的优化 SQL 语句啦,添加缓存以达到减少存取的目的:另外一种办法是修改使用架构,在数据库层面上「 ...