基于sobel 、canny 的边缘检测实现
一.实验原理
Sobel 的原理:
索贝尔算子(Sobel operator )是图像处理中的算子之一,主要用作边缘检测。
在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。
在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量.
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
如果以A 代表原始图像,Gx 及Gy 分别代表经横向及纵向边缘检测的图像,其公式如下:
101202*101x G A -+⎛⎫ ⎪=-+ ⎪ ⎪-+⎝⎭ 121000*121y G A +++⎛⎫ ⎪= ⎪ ⎪---⎝⎭
图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。
在边沿检测中,常用的一种模板是Sobel 算子。
Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。
与 和 相比,Sobel 算子对于象素的位置的影响做了加权,因此效果更好。
Sobel 算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。
各向同性Sobel 算子和普通Sobel 算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel 算子的处理方法。
由于Sobel 算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。
美中不足的是,Sobel 算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel 算子没有基于图像灰度进行处理,由于Sobel 算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
Canny 的原理:
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘
的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
这就是Canny边缘检测
算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
Canny边缘检测算法
step1:用高斯滤波器平滑图象;
step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:对梯度幅值进行非极大值抑制
step4:用双阈值算法检测和连接边缘
二.实验过程
利用上述原理实现车牌号的检测及识别
实验程序:
%这是一个图像对象提取方案。
车辆号牌的书面分割和提取
clc;
clear all;
im=imread('bmw.bmp');
im1=rgb2gray(im);
im1=medfilt2(im1,[3 3]); %中值滤波消除图像噪声%
BW = edge(im1,'sobel'); %寻找边缘
[imx,imy]=size(BW);
msk=[0 0 0 0 0;
0 1 1 1 0;
0 1 1 1 0;
0 1 1 1 0;
0 0 0 0 0;];
B=conv2(double(BW),double(msk)); %平滑图像,减少连接的元件数量
L = bwlabel(B,8); %计算连通
mx=max(max(L))
[r,c] = find(L==17);
rc = [r c];
[sx sy]=size(rc);
n1=zeros(imx,imy);
for i=1:sx
x1=rc(i,1);
y1=rc(i,2);
n1(x1,y1)=255;
end %存储在数组中提取图像
DD=edgecolor('bmw.bmp');%此处实现cany检测,通过调用函数的方式实现,函数代码在下面附有
figure,imshow(im);
title('原始的彩色图像')
figure,imshow(im1);
title('转换后的二值图像')
figure,imshow(B);
title('sobel边缘检测后的图像')
figure,imshow(B);
title('canny边缘检测后的图像')
CANY检测的函数部分:
function R=edgecolor(nm);
img=imread(nm);
[x y z]=size(img);
if z==1
rslt=edge(img,'canny');
elseif z==3
img1=rgb2ycbcr(img);
dx1=edge(img1(:,:,1),'canny');
dx1=(dx1*255);
img2(:,:,1)=dx1;
img2(:,:,2)=img1(:,:,2);
img2(:,:,3)=img1(:,:,3);
rslt=ycbcr2rgb(uint8(img2));
end
R=rslt;
根据上图明显可以得出canny 检测比sobel检测的效果更好。
三、实验总结
1、sobel算子根据像素点上下、左右邻点灰度值加权值,在边缘处打到极大值这一
现象检测边缘。
对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。
当对精度要求不是很高的时候,是一种较为常用的边缘检测的方法。
2、canny算子是边缘检测中最具有代表的一种局部极值边缘检测。
无论从视觉效果
还是客观评价来看,canny算子提取的边缘线性连接程度较好,对此类的边缘提取的比较完整,边缘线很细腻。