7.边缘检测:2D运算——Canny的不同结果、单个2D边缘检测滤波器、实现边缘3种方法Matlab实战_3
目录
Canny的不同结果
单个2D边缘检测滤波器
实现边缘3种方法Matlab实战
第一种 图像差异
第二种 Canny边缘检测器
第三种 高斯拉普拉斯变换
Canny的不同结果
右边的图像是左边的一个边缘后的结果。
有趣的是,我的意思是,它看起来很不错,是一个很好的边缘图像。
但是我的第一个计算机视觉课程来自Berthold Horn,他是计算机视觉的创造者之一。
而且,他表达了他关心的是:很难知道什么时候图像的边缘的效果最好。
因为真正的问题是:你要用这些边缘来做什么?
我要说的是,Canny的边缘算子比其他边缘算子要更好。这意味着它们会把你想要的边缘拉出来,以便你将来处理。
当然,现在有一个问题,既然我们在做这些平滑的导数,那么我们用什么大小的高斯核来计算边缘呢?
正如我们之前说过的,不同的Sigmas,这里我们有Sigma 1, Sigma 2应用在这个小丑图像上,
你可以看到它对边缘图像做了什么:
大sigma检测大尺度图像,小sigma检测小尺度图像。
而选择取决于你想要做什么。
小测验:
Canny的边缘算子对噪声可能相当敏感。
A,正确,导数会加重噪声。
B,错误,梯度是用高斯算子的导数来计算的,它消除了噪声。
C,大部分是错的,这取决于你选择的。
答案:C。这与噪音规格相当不错,但你必须担心你选择的Sigma。
单个2D边缘检测滤波器
最后一件事要展示给你们的是完整的。
还记得高斯函数二阶导数的一维情况吗?
这是原来的高斯函数:
这个二阶导数是墨西哥帽算子:
当我们把它应用到 f 上时,这和平滑版的二阶导数是一样的:
我们在寻找那个点那些被称为零交叉的点,在底部的图上,它对应于边的位置:
但是在二维空间中做这个有点难,原因是:
求导的方向不止一个。
这里是高斯分布,公式是这样的,中间是一座漂亮的山:
但是我们必须在一个方向上求导,你知道的,下面这个图,这是x,这是1和Y:
在二阶导数上有三种选择。
我可以再次求x的偏导,所以 f² 的偏导是x的偏导的两倍。
我可以对y求偏导,两次。
我也可以求f关于y的偏导。
我应该用哪一个?
正确的答案是,你用的是高斯拉普拉斯方程。
拉普拉斯算子,就是x (f)对x²的二阶导数 加上 f (f)对y²的二阶导数:
这就是对称地给你这个墨西哥帽子操作符的原因:
如果你把它应用到图像上,取0叉乘,就会得到边。
实际上,如果你在matlab中运行一些关于边的演示代码。
你可以采取Canny边缘,或者取高斯分布的差异或者取高斯分布的拉普拉斯分布的差异,它们几乎是相同的。
你可以看到,它所做的是寻找0叉乘这是获得边的另一种方法。
其中一个挑战往往是封闭计数器,而Canny只能找到你那些有一定数量支持的轮廓。
我想告诉你们大多数人,更多的人可能会用canny来做常规的边缘检测。
三种方法画出边缘MATLAB实战
下面是MATLAB的一个快速演示,展示了几种不同的计算方法。
注意,你也可以用Octave来做。只需记住加载图像包。
好的,让我们读一个图像并显示它。
这里,我们使用figure打开一个新窗口,imshow显示窗口中的图像,title设置标题,所有这些都在一行中。
我们会经常使用这个习语。
>> %% Read Leaa image
>> lena = imread('Leana.png');
>> figure, imshow(lena), title('Original image , color');
代码运行如下:
现在我们将图像转换为单色或灰度。为此,我们将使用rgb2gray函数。
>> %% Read Leaa image
>> lena = imread('Leana.png');
>> figure, imshow(lena), title('Original image , color');
>>
>> %% Convert to monochrome (grayscale) using rgb2gray
>> lenaMono = rgb2gray(lens);
>> figure, imshow(lenaMono), title('Original image, monochrome');
这就是它的样子:
现在让我们创建一个平滑的图像版本。首先,使用fspecial函数创建一个高斯滤波器。
>> %% Make a blurred/smoothed version
>> h = fspecial('gaussian', [11 11], 4);
>> h
这是过滤器h的样子:
哇,把它画成一个平面可能会有帮助。
>> figure, suref(h);
代码显示:
现在将这个过滤器应用到图像上:
>> lenaSmooth = imfilter(lenaMono, h);
把这个和原来的比较一下:
第一种 图像差异
好的。对于第一种方法,我们将把图像左移一个像素,右一个像素,并计算它们的差异。
让我们复制一个平滑的版本来创建左边的图像。
为了将图像向左移动,我们复制所有像素,从第二列开始直到最后位置第一列到n - 1。
注意,这里的最后一列和第二列是相同的。
>> %% Method 1: Shift lef and right, and show diff image
>> lenaL = lenaSmooth;
>> lenaL(:, [1:(end - 1)]) = lenaL(:, [2:end]);
右边同样也是这么操作。
>> lenaR = lenaSmooth;
>> lenaR(:, [2:(end)]) = lenaR(:, [1:end - 1]);
现在我们计算两张图片的差异,记住转换为double类型。
注意,差异可能包含负数。
>> lenaDiff = double(lenaR) - double(lenaL);
为了正确显示它,我们传入一个空向量作为第二个参数。
>> figure, imshow(lenaDiff, []), title('Difference between right and left shifted images');
代码显示:
请注意,对象边界是如何被突出显示为较亮或较暗的区域的,这表示更大的正或负差异。
其他区域几乎是灰色的,表明接近于零的差异。
第二种 Canny边缘检测器
第二种方法是使用canny边缘检测器。
我们使用edge函数,传入'canny'作为方法参数。
>> %% Method 2: Canny edge detector
>> cannyEdges = edge(lenaMono, 'canny');
>> figure, imshow(cannyEdges), title('Edges of smoothed image');
代码结果:
还记得Canny算法执行非极大抑制吗?
这与其他一些技巧一起,产生了更有意义的边缘图像:
我们还可以在平滑的图像上运行Canny边缘检测器:
注意,现在有很多细节特性都消失了。
这是原始的边缘集,以供比较:
第三种 高斯拉普拉斯变换
我们的最后一种方法使用高斯拉普拉斯算子。
继续使用edge函数,您只需要将'log'作为方法参数传入。
%% Method 3: Laplacian of Gaussian
>> logEdges = edge(lenaMono, 'log');
>> figure, imshow(logEdges), title('Laplacian of Gaussian');
同样,Canny所发现的边缘被显示出来进行比较:
您可以使用doc edge找到更多可用的选项。
>> doc edge
代码运行结果:
如您所见,您还可以应用其他的边缘运算符,以及传入定制参数。
结语:
这就是关于边缘检测的环节的总结,事实上,目前都是关于图像处理的。
希望你们已经学了一些卷积和相关滤波的知识,以及求导的概念。
我们还讨论了过滤器被用作模板。接下来,我们要做的是我们要绕一圈,做一些真正的电脑视觉。
也就是说,计算一些数据结构告诉我们从图像中得到了什么,我们会使用这些边然后我们会回来做更多关于图像处理的事情。
但是首先,你必须要去找一些线条,圆圈,硬币和图片里的东西。非常酷。
——学会编写自己的代码,才能练出真功夫。
7.边缘检测:2D运算——Canny的不同结果、单个2D边缘检测滤波器、实现边缘3种方法Matlab实战_3相关推荐
- 7.边缘检测:2D运算——Canny边缘原理、Canny边缘检测器、Canny-Matlab实战_2
目录 Canny边缘原理 Canny边缘检测器 Canny-Matlab实战 Canny边缘原理 既然我们知道了如何计算光滑导数和梯度,我们就可以回到如何找到边的问题上. 基本上这是一个多步骤的过程, ...
- python边缘检测代码_python Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf
自适应canny算法研究及其在图像边缘检测中的应用.pdf 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容 ...
- c#用canny算子做边缘提取_干货 | 边缘检测
最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...
- 内置式永磁电机maxwell2d_高性能永磁电机设计和制造之ANSYS Maxwell 2D求解齿槽转矩的几种方法...
来源 |ANSYS电磁场 齿槽转矩是永磁电机特有的问题之一,是高性能永磁电机设计和制造中必须考虑和解决的关键问题. 其表现是当永磁电机绕组不通电时,永磁体和定子铁芯之间相互作用产生的转矩,它是永磁体与 ...
- 2d shader unity 阴影_Unity中实现2D光照系统
在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...
- 列运算_Power Query列运算的几种方法比较
有时候我们需要在报表中进行列之间的运算,例如下面这个例子: 在Excel中,这种计算很常见.很简单,只需要新增一列,把相关的两列相加,然后替换掉原来的"总客户数"列中的数据就可以了 ...
- java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法
在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...
最新文章
- 某快手程序员吐槽:月薪四万很惶恐!和老婆亲热时都在想工作,薪资越高,做人越怂!
- 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)
- 2020-11-15(getinstance)
- H5版定点投篮游戏编程设计--物理模型抽象
- mysql 概念和逻辑架构
- 【BZOJ 1001】[BJOI2006]狼抓兔子(最大流)
- loj2090. 「ZJOI2016」旅行者
- 结对编程 - 马尔科夫链
- python颜色表_数据库表连接的简单解释 | 图文并茂,通俗易懂
- 应用发布前,需要注意事情
- MySQL:浅析 Impossible WHERE noticed after reading const tables
- iOS 手记 - 计算文字高度/宽度:- (CGSize)sizeWithAttributes:(NSDictionaryNSString *,id *)attrs...
- 单片机c语言案例教程,单片机C语言案例教程
- Python环境搭建教程
- 计算机在bios设置用u盘启动不,bios设置u盘启动图解
- 《JAVA 技术》第二次作业
- HDU3404POJ3533(Nim积摸版)
- 使用canvas 画钟表
- 【青少年编程】【Scratch】03 声音模块
- CTF——MISC习题讲解(GKCTF 2021系列)
热门文章
- Android笔记 get方式提交数据到服务器 避免乱码 demo
- mint linux qq,linuxmint系统下安装QQ
- pandas保存为csv格式文件
- MySQL入门(一) MacOS端配置与基本命令
- Python面向对象编程 __init__方法
- Linux 安装多个版本JDK并设置默认版本
- Python练习:期末测评
- 微信小程序official-account组件的使用及样式设置
- 设计一算法查找链表的中间结点。要求该算法的时间复杂度为O(n),空间复杂度为O(1)
- 主题图标_iPhone一键更换主题、图标神器