目录

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相关推荐

  1. 7.边缘检测:2D运算——Canny边缘原理、Canny边缘检测器、Canny-Matlab实战_2

    目录 Canny边缘原理 Canny边缘检测器 Canny-Matlab实战 Canny边缘原理 既然我们知道了如何计算光滑导数和梯度,我们就可以回到如何找到边的问题上. 基本上这是一个多步骤的过程, ...

  2. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  3. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  4. caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf

    自适应canny算法研究及其在图像边缘检测中的应用.pdf 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容 ...

  5. c#用canny算子做边缘提取_干货 | 边缘检测

    最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...

  6. 内置式永磁电机maxwell2d_高性能永磁电机设计和制造之ANSYS Maxwell 2D求解齿槽转矩的几种方法...

    来源 |ANSYS电磁场 齿槽转矩是永磁电机特有的问题之一,是高性能永磁电机设计和制造中必须考虑和解决的关键问题. 其表现是当永磁电机绕组不通电时,永磁体和定子铁芯之间相互作用产生的转矩,它是永磁体与 ...

  7. 2d shader unity 阴影_Unity中实现2D光照系统

    在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...

  8. 列运算_Power Query列运算的几种方法比较

    有时候我们需要在报表中进行列之间的运算,例如下面这个例子: 在Excel中,这种计算很常见.很简单,只需要新增一列,把相关的两列相加,然后替换掉原来的"总客户数"列中的数据就可以了 ...

  9. java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

最新文章

  1. 某快手程序员吐槽:月薪四万很惶恐!和老婆亲热时都在想工作,薪资越高,做人越怂!
  2. 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)
  3. 2020-11-15(getinstance)
  4. H5版定点投篮游戏编程设计--物理模型抽象
  5. mysql 概念和逻辑架构
  6. 【BZOJ 1001】[BJOI2006]狼抓兔子(最大流)
  7. loj2090. 「ZJOI2016」旅行者
  8. 结对编程 - 马尔科夫链
  9. python颜色表_数据库表连接的简单解释 | 图文并茂,通俗易懂
  10. 应用发布前,需要注意事情
  11. MySQL:浅析 Impossible WHERE noticed after reading const tables
  12. iOS 手记 - 计算文字高度/宽度:- (CGSize)sizeWithAttributes:(NSDictionaryNSString *,id *)attrs...
  13. 单片机c语言案例教程,单片机C语言案例教程
  14. Python环境搭建教程
  15. 计算机在bios设置用u盘启动不,bios设置u盘启动图解
  16. 《JAVA 技术》第二次作业
  17. HDU3404POJ3533(Nim积摸版)
  18. 使用canvas 画钟表
  19. 【青少年编程】【Scratch】03 声音模块
  20. CTF——MISC习题讲解(GKCTF 2021系列)

热门文章

  1. Android笔记 get方式提交数据到服务器 避免乱码 demo
  2. mint linux qq,linuxmint系统下安装QQ
  3. pandas保存为csv格式文件
  4. MySQL入门(一) MacOS端配置与基本命令
  5. Python面向对象编程 __init__方法
  6. Linux 安装多个版本JDK并设置默认版本
  7. Python练习:期末测评
  8. 微信小程序official-account组件的使用及样式设置
  9. 设计一算法查找链表的中间结点。要求该算法的时间复杂度为O(n),空间复杂度为O(1)
  10. 主题图标_iPhone一键更换主题、图标神器