Canny检测
- 格式:docx
- 大小:1.31 MB
- 文档页数:6
canny边缘检测matlab代码Canny边缘检测是一种常用的图像处理算法,它可以有效地检测图像中的边缘,并将其显示为白色线条。
在Matlab中,可以使用以下代码实现Canny边缘检测:1. 读取图像首先,需要读取待处理的图像。
可以使用imread函数来读取图片:```matlabimg = imread('image.jpg');```其中,image.jpg是待处理的图片文件名。
2. 灰度化Canny算法只能处理灰度图像,因此需要将彩色图像转换为灰度图像。
可以使用rgb2gray函数来实现:```matlabgray_img = rgb2gray(img);```3. 高斯滤波在进行边缘检测之前,需要对图像进行高斯滤波来消除噪声。
可以使用fspecial和imfilter函数来实现:```matlabgaussian_filter = fspecial('gaussian', [5 5], 1);blur_img = imfilter(gray_img, gaussian_filter, 'replicate');```其中,[5 5]表示高斯核的大小为5x5,1表示标准差。
4. 计算梯度幅值和方向接下来,需要计算每个像素点的梯度幅值和方向。
可以使用Sobel算子来计算梯度,并利用arctan函数计算方向角度:```matlabsobel_x = [-1 0 1; -2 0 2; -1 0 1];sobel_y = [-1 -2 -1; 0 0 0; 1 2 1];grad_x = imfilter(blur_img, sobel_x, 'replicate');grad_y = imfilter(blur_img, sobel_y, 'replicate');grad_mag = sqrt(grad_x.^2 + grad_y.^2);grad_dir = atan(grad_y ./ grad_x);```5. 非极大值抑制由于Sobel算子计算出的梯度幅值可能会有多个峰值,因此需要进行非极大值抑制来保留边缘。
基于sobel和canny的边缘检测原理
Sobel的原理:
Sobel 算子是图像处理中的算子之一,主要用作边缘检测。
它是一种离散性差分算子,用来运算图像亮度函数的梯度之近似值。
在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量.
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
以I代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:
由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。
但是Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
Canny的原理:
1、图象边缘检测必须满足两个条件:其一必须有效地抑制噪声;其次必须尽量精确确
定边缘的位置。
2、根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
这就是Canny边缘检测
算子。
3、类似于LoG边缘检测方法,属于先平滑后求导数的方法。
Canny边缘检测算法可以分为四个步骤:
1)用高斯滤波器平滑图象;
2)用一阶偏导的有限差分来计算梯度的幅值和方向;3)对梯度幅值进行非极大值抑制
4)用双阈值算法检测和连接边缘。
canny边缘检测的原理
Canny边缘检测是一种多级检测算法,其基本原理如下:
首先,使用高斯滤波器对图像进行平滑处理,以减少图像中的噪声。
然后,计算图像的梯度大小和方向,以便确定边缘的位置和方向。
在计算梯度的过程中,会遍历每个像素点,判断该像素点是否为边缘点。
在Canny算法中,非极大值抑制和双阈值法是两个关键步骤。
非极大值抑制的目的是去除那些非边缘的像素点,保留可能的边缘点。
双阈值法则是为了进一步筛选出真正的边缘点,避免出现过多的假边缘。
最后,Canny算法会对检测到的边缘进行跟踪和连接,形成完整的边缘图像。
总的来说,Canny边缘检测算法是一种非常有效的边缘检测算法,能够准确地检测出图像中的边缘,并且在处理噪声和防止假边缘方面具有很好的性能。
1、边缘检测原理及步骤在之前的博文中,作者从一维函数的跃变检测开始,循序渐进的对二维图像边缘检测的基本原理进行了通俗化的描述。
结论是:实现图像的边缘检测,就是要用离散化梯度逼近函数根据二维灰度矩阵梯度向量来寻找图像灰度矩阵的灰度跃变位置,然后在图像中将这些位置的点连起来就构成了所谓的图像边缘(图像边缘在这里是一个统称,包括了二维图像上的边缘、角点、纹理等基元图)。
在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的,同时大多数的传感器件具有低频滤波特性,这样会使得阶跃边缘变为斜坡性边缘,看起来其中的强度变化不是瞬间的,而是跨越了一定的距离。
这就使得在边缘检测中首先要进行的工作是滤波。
1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。
常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文),然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。
2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。
增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。
在具体编程实现时,可通过计算梯度幅值来确定。
3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。
实际工程中,常用的方法是通过阈值化方法来检测。
2、Canny边缘检测算法原理JohnCanny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。
本节对根据上述的边缘检测过程对Canny检测算法的原理进行介绍。
2.1 对原始图像进行灰度化Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像,那首先就得进行灰度化。
对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。
Canny边缘检测算法的⼀些改进传统的Canny边缘检测算法是⼀种有效⽽⼜相对简单的算法,可以得到很好的结果(可以参考上⼀篇)。
但是Canny算法本⾝也有⼀些缺陷,可以有改进的地⽅。
1. Canny边缘检测第⼀步⽤⾼斯模糊来去掉噪声,但是同时也会平滑边缘,使得边缘信息减弱,有可能使得在后⾯的步骤中漏掉⼀些需要的边缘,特别是弱边缘和孤⽴的边缘,可能在双阀值和联通计算中被剔除。
很⾃然地可以预见,如果加⼤⾼斯模糊的半径,对噪声的平滑⼒度加⼤,但也会使得最后得到的边缘图中的边缘明显减少。
这⾥依然⽤Lena图为例,保持Canny算法中⾼阀值100,低阀值50不变,⾼斯半径分别为2,3,5的Canny边缘⼆值图像如下。
可知⾼斯模糊把很多有⽤的边缘信息也模糊掉了,因此如何精确的选择⾼斯半径就相当重要。
⾼斯半径2 ⾼斯半径3 ⾼斯半径52. 在最初的Canny算法中是使⽤的最⼩的2x2领域来计算梯度幅值的。
这种⽅法对噪声很敏感,⽐较容易检测到伪边缘或漏掉真是边缘。
在上⼀篇算法实现中,实际上使⽤的是3x3的Sobel梯度算⼦,是⼀种⽐较好的选择。
3. 传统Canny算法的双阀值是全局固定的,因此双阀值⼤⼩的选取对最终的结果影响很⼤,也有⼀些经验,⽐如选择低阀值是⾼阀值的0.4或0.5。
然⽽这毕竟是⼀种经验选择,阀值的确定仍然很难决定⼀个最优值。
⽽且⼀个图像的不同局部区域可能需要各不相同的阀值来精确地找到真实边缘,因此全局阀值就不太合适了。
4. 传统算法仍然可能产⽣⼀条宽度⼤于1的边缘,达不到满意的⾼精度单点响应。
也就是需要继续细化边缘。
下⾯就⼀些可以改进的地⽅做⼀些讨论。
代替⾼斯模糊噪声是⾼频信号,边缘信号也属于⾼频信号。
既然⾼斯模糊不加区分的对所有的⾼频信息进⾏了模糊,效果⾃然不尽如⼈意。
那么⾃然就想到了带有保留边缘功能的各种选择性平滑⽅法,似乎在这⾥⽐⾼斯模糊会更加合适,那我们就来试⼀试。
带有保留边缘功能的平滑⽅法的基本思想不是让领域范围内的所有像素都参与该种平滑⽅法的计算,⽽是设定⼀个阀值,仅仅让和中⼼像素灰度的差值⼩于这个阀值的像素参与计算。
一.Canny边缘检测算法原理JohnCanny于1986年提出Canny算子,属于是先平滑后求导数的方法。
其处理过程大体上分为下面四部分。
1. 对原始图像进行灰度化Canny算法通常处理的图像为灰度图,因此如果获取的是彩色图像,那首先就得进行灰度化。
对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。
以RGB格式的彩图为例,通常灰度化采用的方法主要有:方法1:Gray=(R+G+B)/3;方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;在编程时要注意图像格式中RGB的顺序通常为BGR。
2. 对图像进行高斯滤波图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现。
1)高斯核实现上式为离散化的一维高斯函数,确定参数就可以得到一维核向量。
上式为离散化的二维高斯函数,确定参数就可以得到二维核向量。
在求得高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波对图像进行高斯滤波,其实就是根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。
这样可以有效滤去理想图像中叠加的高频噪声。
通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这会增加边缘定位的不确定性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度。
实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。
3. 用一阶偏导的有限差分来计算梯度的幅值和方向关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y 方向上偏导数的两个矩阵。
常用的梯度算子有如下几种:1)Roberts算子上式为其x和y方向偏导数计算模板,可用数学公式表达其每个点的梯度幅值为:2)Sobel算子上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:3)Prewitt算子和Sobel算子原理一样,在此仅给出其卷积模板。
北京工业大学研究生课程考试答题纸课程类别:学位课选修课研究生学号:研究生姓名:学生类别:博士硕士工程硕士进修生考试时间:年月日一、实验目的:熟悉边缘检测原理,并运用matlab软件实现图像的canny边缘检测,体会canny 边缘检测的优缺点。
二、实验内容:编写matlab程序,实现对lena图像的边缘检测,输出程序运行结果。
三、实验原理或步骤:首先回顾一下边缘检测的一般步骤:边缘检测算法一般包含如下四个步骤:1.滤波(去噪)。
2.增强(一般是通过计算梯度幅值)。
3.检测(在图像中有许多点的梯度幅值会比较大,而这些点并不都是边缘,所以应该用某种方法来确定边缘点,比如最简单的边缘检测判据:梯度幅值阈值)。
4.定位(有的应用场合要求确定边缘位置,可以在子像素水平上来估计,指出边缘的位置和方向)Canny边缘检测的算法步骤:1.用高斯滤波器平滑图像(不同尺度的Canny检测子由高斯的不同标准差来表示)用一阶偏导的有限差分来计算梯度的幅值和方向。
2.对高斯平滑后的图像进行sobel边缘检测。
这里需要求横的竖的还有联合的,所以一共三个需要sobel边缘检测图像。
3.对联合的sobel检测图像进行非极大值抑制(Non-Maxima Suppression, NMS)4.用双阈值算法检测和连接边缘,并进行滞后阈值处理。
其中非极大值抑制细化了幅值图像中的屋脊带,只保留幅值局部变化最大的点。
双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。
不断收集,直到所有的间隙连接起来为止。
四、运行结果和分析每步运行效果:Figure1原图:Figure2 高斯模糊后:Figure3 sobel边缘检测后:Figure4 非极大抑制后:Figure5 上阈值120,下阈值100检测结果:Canny算子的方向性使得它的边缘检测和定位优于其他算子,具有更好的边缘强度估计,能产生梯度方向和强度两个信息。
matlabcanny边缘检测代码接霍夫变换全文共四篇示例,供读者参考第一篇示例:Matlab是一个强大的数学软件工具,其图像处理工具箱可以帮助我们进行各种图像处理操作,比如边缘检测和霍夫变换。
本文将分享如何使用Matlab进行Canny边缘检测,并结合霍夫变换进行线检测。
Canny边缘检测是一种经典的边缘检测算法,它的优点是能够检测到边缘的细节,并且对噪声具有一定的鲁棒性。
在Matlab中,我们可以通过一行简单的代码来实现Canny边缘检测:```edgeImage = edge(rgb2gray(image), 'canny');```以上代码中,我们首先将原始图像转换为灰度图像,然后调用Matlab的'edge'函数,并指定边缘检测算法为Canny,最后我们将得到的边缘图像存储在edgeImage中。
接下来,我们可以将边缘图像显示出来,以便进行进一步的处理和分析。
```imshow(edgeImage);通过上述代码,我们可以看到Canny边缘检测算法的效果,边缘比较清晰,同时也保留了边缘的细节信息。
接下来,我们将介绍如何使用霍夫变换来进行线检测。
霍夫变换是一种经典的图像处理算法,其主要应用是检测直线和圆等几何形状。
在Matlab中,我们可以通过一行代码来实现霍夫变换的线检测:```[H,theta,rho] = hough(edgeImage);peaks = houghpeaks(H, 10);lines = houghlines(edgeImage, theta, rho, peaks);imshow(image);hold on;for k = 1 : length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');endhold off;以上代码中,我们首先调用Matlab的'hough'函数来计算霍夫变换的极坐标空间。
OpenCV笔记(3)(Canny边缘检测、⾼斯⾦字塔、拉普拉斯⾦字塔、图像轮廓、模板匹配)⼀、Canny边缘检测Canny边缘检测是⼀系列⽅法综合的结果。
其中主要包含以下步骤:1.使⽤⾼斯滤波器,平滑图像,滤除噪声。
2.计算图像中每个像素点的梯度强度和⽅向。
3.应⽤⾮极⼤值抑制(NMS:Non-Maximum Suppression),以消除边缘检测带来的杂散相应。
4.应⽤双阈值(Double-Threshold)检测来确定真实和潜在的边缘。
5.通过抑制孤⽴的弱边缘最终完成边缘检测。
1.⾼斯滤波器平滑图像。
2.计算梯度和⽅向使⽤X和Y⽅向的Sobel算⼦来分别计算XY⽅向梯度:每个点的梯度强度有XY⽅向的梯度计算出来:计算每个点梯度的⽅向:3.使⽤NMS有两种⽅法,第⼀种⽅法(插值法,⽐较复杂):通过计算出的梯度⽅向,找到与周边临近点的边的交点,然后使⽤权重计算交点的值,假设g1和g2之间的交点(左上的⿊点)处于6/4的位置,那么他的值为M = g1*(1-0.6)+g2*(0.4)。
当算出左上的⿊点和右下的⿊点值后,⽤这两个点与C的值进⾏⽐较,如果都⼩于C,则C归为边界。
如果有⼀个⽐C⼤,则丢弃C,这就叫抑制。
第⼆种⽅法(指定8个⽅向,不⽤插值,简化版):4.双阈值检测在NMS的基础上,判断⼀个边界点的梯度强度: (1) 如果值⼤于maxVal,则处理为边界 (2) 如果值minVal<梯度值<maxVal,再检查是否挨着其他边界点,如果旁边没有边界点,则丢弃,如果连着确定的边界点,则也认为其为边界点。
(3) 梯度值<minVal,舍弃。
通过以上步骤,完成Canny边缘检测。
调⽤Canny API如下:# 使⽤Canny边界检测def use_canny(image):# 后⾯两个参数代表双阈值检测的minVal和maxValimg1 = cv.Canny(image, 50, 100)cv.imshow('img1', img1)# 这⾥使⽤更⼤的minVal和maxVal,细节边界变少了img2 = cv.Canny(image, 170, 250)cv.imshow('img2', img2)⼆、⾼斯⾦字塔图像⾦字塔:Image pyramid如图中所⽰,从0到3是⼀个下采样过程(指图⽚越来越⼩的⽅向),从3到0是⼀个上采样过程(将图⽚变⼤的过程),⼀次下采样加⼀次上采样不等于原图像,因为会损失⼀些细节信息。
Canny边缘检测算法的流程介绍边缘检测的⼀般标准包括:1) 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
2) 检测到的边缘应精确定位在真实边缘的中⼼。
3) 图像中给定的边缘应只被标记⼀次,并且在可能的情况下,图像的噪声不应产⽣假的边缘。
在⽬前常⽤的边缘检测⽅法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的⽅法之⼀。
由于它具有满⾜边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流⾏的算法之⼀。
Canny边缘检测算法的处理流程Canny边缘检测算法可以分为以下5个步骤:1) 使⽤⾼斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和⽅向。
3) 应⽤⾮极⼤值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4) 应⽤双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤⽴的弱边缘最终完成边缘检测。
下⾯详细介绍每⼀步的实现思路。
1 ⾼斯平滑滤波为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防⽌由噪声引起的错误检测。
为了平滑图像,使⽤⾼斯滤波器与图像进⾏卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。
⼤⼩为(2k+1)x(2k+1)的⾼斯滤波器核的⽣成⽅程式由下式给出:下⾯是⼀个sigma = 1.4,尺⼨为3x3的⾼斯卷积核的例⼦(需要注意归⼀化):若图像中⼀个3x3的窗⼝为A,要滤波的像素点为e,则经过⾼斯滤波之后,像素点e的亮度值为:其中*为卷积符号,sum表⽰矩阵中所有元素相加求和。
重要的是需要理解,⾼斯卷积核⼤⼩的选择将影响Canny检测器的性能。
尺⼨越⼤,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。
⼀般5x5是⼀个⽐较不错的trade off。
2 计算梯度强度和⽅向图像中的边缘可以指向各个⽅向,因此Canny算法使⽤四个算⼦来检测图像中的⽔平、垂直和对⾓边缘。
实验二 opencv实现canny边缘检测
一、实验目的
1、了解如何在VC++6.0上安装与配置opencv
2、了解canny边缘检测的原理与opencv的实现
二、实验引言
边缘是一幅图像最重要的特征之一,图像边缘部分集中了图像的大部分信息。
因此,边缘的确定对于图像场景的识别与理解非常重要;同时在图像分割中也有重要应用。
可以利用边缘对图像进行区域分析。
边缘在图像体现为局部区域亮度的显著变化,可见这种变化是为灰度面的阶跃。
有很多种方法可以用来对图像边缘进行检测。
本实验中采用Canny边缘检测。
三、实验原理
检测阶跃边缘的基本思想是在图像中找出具有局部最大梯度值的像素点,其大部分的工作集中在寻找能够用于实际图像的梯度数字逼近。
图像梯度逼近必须满足要求:
1、逼近必须能够抑制噪声效应
2、必须尽量精确的确定边缘的位置
Canny检测的基本过程
平滑与计算
Canny边缘检测器就是高斯函数的一阶导数,是对信噪比与定位之间最优化的逼近算子。
高斯平滑和梯度逼近结合的算子不是旋转对称的。
高斯平滑和梯度逼近结合的算子不是旋转对称的。
在边缘方向是对称的,在垂直边缘方向是反对称的(梯度方向)。
该算子在对最急剧变化方向上的边缘很敏感,沿边缘方向不敏感。
非极大值抑制
前面的计算得到梯度的幅度图像阵列为M[i,j],此值的值越大,其对应的图像梯度值也越大。
但还不能精确的确定边缘。
为了确定边缘,必须细化幅度值图像中的屋脊带(ridge ),即只保留幅度值局部变化最大的点。
此过程称为非极大值抑制(non-maxima suppression,NMS ),其结果会产生细化的边缘。
非极大值抑制通过抑制梯度线上所有的非屋脊峰值的幅度值来细化[,]M i j 中的梯度幅值屋脊。
算法使用一个3×3邻域作用在幅值阵列[,]M i j 的所有点上;每一个点上,邻域的中心像素[,]M i j 与沿着梯度线的两个元素进行比较,其中梯度线是由邻域的中心点处的扇区值ζ[i,j ]给出。
如果在邻域中心点处的幅值[,]M i j 不比梯度线方向上的两个相邻点幅值大,则[,]M i j 赋值为零,否则维持原值;此过程可以把M[i,j]宽屋脊带细化成只有一个像素点宽,即保留屋脊的高度值。
非极大值抑制公式为:
[,]([,],[,])N i j N M S M i j i j z =
[,]N i j 中的非零值对应着图像强度阶跃变化处对比度,其坐标对应着图像梯度值经过非极大值抑制后细化得到的边缘。
虽然在边缘检测前经过了图像的高斯平滑,但是经过NMS 后仍然会包含许多噪声和细纹理引起的假边缘段。
所以要经过阈值化处理。
阈值化
去除假边缘的方法是对[,]N i j 使用阈值处理,将低于某一阈值的所有值赋值零,得到图像边缘阵列[,]I i j 。
单阈值τ太低造成的假阳性以及阴影会使边缘对比度减弱; 单阈值t 太高造成的假阴性会使部分轮廓丢失; 常用双阈值1t 和212t t =对非极大值抑制图像[,]N i j 处理得到两个边
缘图像1[,]T i j 和2[,]T i j 。
2[,]T i j 用高阈值得到,所以含有较少的假边缘,但其中有轮廓
的间断。
双阈值要在2[,]T i j 中把边缘连接成轮廓,当到达轮廓端点时,就在1[,]T i j 的8邻
点位置寻找可以连接到轮廓上的边缘。
综述整个算法的主要步骤是:不断的在1[,]T i j 中收
集边缘,直到2[,]T i j 中的所有间隙连接起来位置。
从而得出Canny 算法的具体实现步骤:
Step1:用高斯滤波器平滑图像,去除图像噪声。
一般选择方差为1.4的高斯函数模板和图像进行卷积运算。
Step2:用一阶偏导的有限差分来计算梯度的幅值和方向。
使用 的梯度算子计算x 和y 方向的偏导数 和 ,方向角 ,梯度幅值 。
Step3:对梯度幅值应用非极大值抑制。
幅值M 越大,其对应的图像梯度值也越大,但这
还不足以确定边缘,因为这里仅把图像快速变化的问题转化成求幅值局部最大值问题,为确定边缘,必须细化幅值图像中的屋脊带,只保留幅值局部变化最大的点,生成细化的边缘。
Step4:用双阈值算法检测并且连接边缘。
双阈值法使Canny算子提取的边缘点更具有鲁棒性,高低阈值分别表示为Hth和Lth,对于高阈值Hth的选折,基于计算出的图像梯度值对应的直方图进行选取。
三.实验过程
1、按手册正确安装VC++6.0和opencv1.0并对VC++6.0添加一系列库文件完成配置
2、在VC++6.0上添加工程,根据算法编写程序并执行。
3、运行并观察结果
四.程序流程图
五、实验结果
下面是第一个阈值始终为1,第二个阈值依次增大下检测出来的图像。
可见阈值越大原图像中变化越不太显的部分渐渐消失,当阈值最大时剩下的就是图像中亮暗变化最明显的部分。
六、参考文献与资料
贾云得,机器视觉,科学出版社,2000
中国Opencv官网:/浏览时间:2011年5月29日
七、附录
代码:
#pragma package <opencv>
#include "cv.h"
#include "highgui.h"
char wndname[] = "Canny边缘检测后图像";
char tbarname[] = "阀值";
int edge_thresh = 1;
IplImage *image, *cedge, *gray, *edge;
//编写函数实现Canny检测和图片的转存等一系列操作
void on_trackbar(int i)
{
cvSmooth(gray,edge,CV_BLUR,3,3,0,0); //CV_BLUR:对每个象素3×3邻域求和并做尺度变换1/(3.3).
cvCanny(gray,edge,(float)edge_thresh,(float)edge_thresh*3,3); // 做canny检测
cvZero( cedge ); //图像清零
cvCopy( image, cedge, edge ); //从image中复制edge部分到cedge
cvShowImage(wndname, cedge); //显示图片
}
int main()
{ //读图并判断
image = cvLoadImage("G:\\sex.BMP");
if (!image)
{
return -1;
}
cedge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3); // 建立检测图像
gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1);
cvCvtColor(image, gray, CV_BGR2GRAY); //imege色彩空间从RGB到gray转换给gray
cvNamedWindow(wndname, 1); // 创建窗口
cvNamedWindow("原图像", 2);
cvShowImage("原图像", image);//显示原图像
cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar); // 创建滑块栏
on_trackbar(0); // 显示窗口
cvWaitKey(0); //等待按键
cvReleaseImage(&image); //释放图像
cvDestroyWindow(wndname); //销毁窗口
cvDestroyWindow("原图像");
return 0;
}。