#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/objdetect.hpp> #include<iostream> using namespace std; using namespace cv; int main(int argc, char **argv) { //加载图片并显示 Mat src = imread("D://XR//JZ//building1.jpg"); imshow("原图",src); //灰度化 Mat grey; cvtColor(src,grey,COLOR_BGR2GRAY); //调用canny函数 Mat edge; Canny(grey,edge,3,9,3); //显示图片 imshow("结果", edge); waitKey(0); }
小编这周又要给小伙伴们讲课啦,学长给我安排的任务是边缘检测。小编翻了翻书,一共有70页。哇!!!范围好大,不过再多还是要讲的,只能跟中秋节说再见了,(╥╯^╰╥)。
小编还是先做个笔记吧,现在能写清楚,到时候就能说清楚。以下内容是我看了许多的博客,自己整合得来的,至于图都是盗来的。
首先,什么是边缘检测呢?
图像的边缘指的是灰度值发生急剧变化的位置。在小编看来,边缘检测是检测出物体的边缘并描绘出来形成一个线图。一般边缘检测都是通过计算梯度幅值,凸显出灰度强度有显著变化的点。
一般边缘检测的有3个步骤:先滤波消除噪声,再计算梯度找出灰度变化强烈的位置,最后阈值化检测找出物体边缘。
梯度:本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。梯度反映的是空间变量变化趋势的最大值和方向
梯度方向:是指局部增长最快的方向。以此类推,负梯度方向是指局部下降最快的方向。
边缘检测有很多方法,小编还是先讲一下常用的吧。
1.canny边缘检测
最优的边缘检测算法,先平滑后求导数的方法。
(1)高斯平滑滤波器(消除噪声)
图像矩阵I分别与水平方向上的卷积核sobel(x)和垂直方向上的卷积核sobel(y)卷积得到dx和dy。通常卷积矩阵为奇数。
待处理图像数据(5*5): 卷积核:(3*3)
A = [17 24 01 08 15 H = [8 1 6
23 05 07 14 16 3 5 7
04 06 13 20 22 4 9 2]
10 12 19 21 03
11 18 25 02 09]
步骤:
①将算子围绕中心旋转180度
H’=[2 9 4
7 5 3
6 1 8]
②滑动算子,每个像素相乘相加得到一个数,放入矩阵中间的位置。
例如:(2,4)元素值= 1* 2+ 8* 9+15* 4+ 7* 7+14* 5+16* 3+13* 6+20* 1+22* 8=575
遇到边界则赋值为0。
③重复①②的操作得到dx和dy。
(2)计算梯度幅值和方向(找出灰度变化强烈的地方)
利用高斯滤波得到卷积矩阵dx和dy,利用以下公式来计算:
(3)非极大值抑制(保留了极大值,抑制了非极大值,排除非边缘像素,仅保留了一些细线条)
对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊,所以要进行非极大值抑制。解决方法:利用梯度方向。
算法:①将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
②如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制为0。
通常为了更加精确的计算,在跨越梯度方向的两个相邻像素之间使用线性插值来得到要比较的像素梯度,现举例如下:
如图3-2所示,将梯度分为8个方向,分别为E、NE、N、NW、W、SW、S、SE,其中0代表00~45o,1代表450~90o,2代表-900~-45o,3代表-450~0o。像素点P的梯度方向为theta,则像素点P1和P2的梯度线性插值为:
其中E、NE、W等表示该方向上的像素值。
因此非极大值抑制的伪代码描写如下:
(4)滞后阈值(还是有噪声,更准确的找出边缘。)
一般用双阈值检测,设置两个阈值,高阈值TH和低阈值TL。一般比率为2:1或3:1。
如果边缘像素的梯度值高于高阈值,则将其标记为1;如果边缘像素的梯度值小于高阈值并且大于低阈值,则使用8连通域确定,只有与TH像素连接时才会被接受标记成1;如果边缘像素的梯度值小于低阈值,则会被抑制为0。阈值的选择取决于给定输入图像的内容。
双阈值检测的伪代码描写如下:
4连通和8连通域:
所谓四连通区域或四邻域,是指对应像素位置的上、下、左、右,是紧邻的位置。共4个方向,所以称之为四连通区域,又叫四邻域。
所谓八连通区域或八邻域,是指对应位置的上、下、左、右、左上、右上、左下、右下,是紧邻的位置和斜向相邻的位置。共8个方向,所以称之为8连通区域或八邻域。
八连通则定义为:
即点(x,y)的8连通域指的是这个点周围的8个点,例如(x,y)的8联通区域为 (x-1,y-1);(x-1,y);(x-1,y+1); (x,y-1) ;(x,y+1); (x+1,y-1) ;(x+1,y);(x+1,y+1)。
将一个点a带入式子,若得出的坐标与b相同则两个点连通。
对每一个值为1的点若其八连通有一个点的值也为1,那么这两个点就归为一个物体。 从8连通的定义公式可以看到,其为N4四连通并上右下、右上、左下、左上四点,即四连通是八连通的子集。也就是说在图像处理中四连通的区域,一定是八连通。
从上图可以看到,4连通意义上,可以分成独立的三个区域。
在8连通意义上,同样的一个图像,只有一个区域。
原始图像:
边缘检测图像:
相关推荐
Canny 边缘检测是 OpenCV 库中实现的一种经典边缘检测算法,它由 John F. Canny 在1986年提出,旨在提供一种准确且鲁棒的边缘检测方法。 Canny 边缘检测的主要目标是检测图像中亮度显著变化的地方,这些地方通常...
Canny边缘检测算法可以分为以下5个步骤: 1) 使用高斯滤波器,以平滑图像,滤除噪声。 2) 计算图像中每个像素点的梯度强度和方向。 3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应...
博文《【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑》的配套详细注释源代码。 博文链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 1.已将dll...
OpenCV(开源计算机视觉库)提供了多种边缘检测算法,其中Canny算子是一种广泛使用的经典算法,它以其高精度和低误检率而著称。在本教程中,我们将深入探讨如何在Visual Studio 2015上使用C++和OpenCV库来实现Canny...
可直接使用
OpenCV Canny边缘检测 OpenCV是一个计算机视觉库,提供了许多有用的函数和类来处理图像和视频。其中,Canny边缘检测是一个常用的图像处理技术,用于检测图像中的边缘。下面将详细介绍OpenCV中的Canny边缘检测。 ...
在这个特定的案例中,我们关注的是OpenCV如何实现边缘检测,特别是Canny算法。Canny边缘检测是一种广泛使用的边缘检测方法,由John F. Canny在1986年提出,它以其高精度和低错误率而闻名。 Canny边缘检测算法主要...
在给定的“Opencv Canny 边缘检测”主题中,我们主要关注的是如何利用OpenCV库中的Canny算法来实现图像的边缘检测。Canny算法是一种经典的多级边缘检测方法,由John F. Canny于1986年提出,因其高精度和低误检率而被...
在"opencv3.0边缘检测"这个主题中,我们将重点关注Canny算法,因为它是最常用的边缘检测方法之一,以其鲁棒性和准确性著称。 Canny边缘检测算法包括以下几个步骤: 1. **高斯滤波**:首先,为了消除图像噪声,...
1. Canny算子:Canny算法是一种多级边缘检测方法,它包含高斯滤波、计算梯度强度和方向、非极大值抑制以及双阈值检测四个步骤。Canny算子既能有效地检测出边缘,又能减少假阳性边缘。 2. Sobel算子:Sobel算子通过...
图像的边缘检测的原理是检测出图像中所有灰度...Canny 边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍,本文主要介绍如何在OpenCV中对图像进行Canny 边缘检测,下面就来看看这个函数的原型。
OpenCV是一个广泛使用的开源计算机视觉库,提供了多种边缘检测算法,其中包括著名的Canny算法。本篇将详细介绍Canny边缘检测算法在OpenCV中的应用。 Canny算法由John F. Canny在1986年提出,它是一种多级边缘检测...
OpenCV之Canny边缘检测是图像处理中的一个重要概念,它是一种多级边缘检测算法,由John F. Canny在1986年提出。该算法以其高效性和准确性著称,被广泛应用于计算机视觉、图像分析和机器学习等领域。Canny边缘检测...
OpenCV是一个强大的开源计算机视觉库,它提供了多种边缘检测算法,包括Canny和Sobel等。让我们深入探讨这些算法的工作原理、优缺点以及如何在OpenCV中实现它们。 **Canny边缘检测算法** Canny算法是一种多级边缘...
opencv的canny检测功能,Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。
在"opencv_基于c++实现的opencv图像处理算法之Canny边缘检测"这个项目中,开发者将详细介绍如何使用OpenCV库进行Canny边缘检测的每一个步骤,并可能提供示例代码,帮助读者理解并应用到自己的项目中。通过学习这个...
在OpenCV库中,Canny边缘检测是一种广泛使用的算法,用于图像处理中的边缘检测任务。在本教程中,我们将深入探讨OpenCV3.0版本中Canny算法的应用及其原理。 Canny边缘检测算法由John F. Canny在1986年提出,它是一...
边缘检测是计算机视觉中的一个关键步骤,OpenCV提供了多种边缘检测算法,如Canny、Sobel、Laplacian和Hough Transform。Canny算法是一种广泛使用的边缘检测方法,它通过高斯滤波、计算梯度强度和方向、非极大值抑制...
Canny边缘检测是OpenCV中常用的一种经典边缘检测方法,由John F. Canny在1986年提出。这个方法通过多级计算和非极大值抑制来有效地找到图像中的边缘,同时减少假阳性边缘的检测。 在【标题】"opencv 实现canny检测...