图像边缘检测各种算子MATLAB实现以及实际应用

合集下载

基于Matlab的图像边缘检测算法的实现及应用汇总

基于Matlab的图像边缘检测算法的实现及应用汇总

目录摘要 (1)引言 (2)第一章绪论 (3)1.1 课程设计选题的背景及意义 (3)1.2 图像边缘检测的发展现状 (4)第二章边缘检测的基本原理 (5)2.1 基于一阶导数的边缘检测 (8)2.2 基于二阶导的边缘检测 (9)第三章边缘检测算子 (10)3.1 Canny算子 (10)3.2 Roberts梯度算子 (11)3.3 Prewitt算子 (12)3.4 Sobel算子 (13)3.5 Log算子 (14)第四章MATLAB简介 (15)4.1 基本功能 (15)4.2 应用领域 (16)第五章编程和调试 (17)5.1 edge函数 (17)5.2 边缘检测的编程实现 (17)第六章总结与体会 (20)参考文献 (21)摘要边缘是图像最基本的特征,包含图像中用于识别的有用信息,边缘检测是数字图像处理中基础而又重要的内容。

该课程设计具体考察了5种经典常用的边缘检测算子,并运用Matlab进行图像处理结果比较。

梯度算子简单有效,LOG 算法和Canny 边缘检测器能产生较细的边缘。

边缘检测的目的是标识数字图像中灰度变化明显的点,而导函数正好能反映图像灰度变化的显著程度,因而许多方法利用导数来检测边缘。

在分析其算法思想和流程的基础上,利用MATLAB对这5种算法进行了仿真实验,分析了各自的性能和算法特点,比较边缘检测效果并给出了各自的适用范围。

关键词:边缘检测;图像处理;MATLAB仿真引言边缘检测在图像处理系统中占有重要的作用,其效果直接影响着后续图像处理效果的好坏。

许多数字图像处理直接或间接地依靠边缘检测算法的性能,并且在模式识别、机器人视觉、图像分割、特征提取、图像压缩等方面都把边缘检测作为最基本的工具。

但实际图像中的边缘往往是各种类型的边缘以及它们模糊化后结果的组合,并且在实际图像中存在着不同程度的噪声,各种类型的图像边缘检测算法不断涌现。

早在1965 年就有人提出边缘检测算子,边缘检测的传统方法包括Kirsch,Prewitt,Sobel,Roberts,Robins,Mar-Hildreth 边缘检测方法以及Laplacian-Gaussian(LOG)算子方法和Canny 最优算子方法等。

laplacian算子matlab程序

laplacian算子matlab程序

laplacian算子matlab程序Laplacian算子是常用的图像处理算法之一,它可以用于边缘检测、图像增强等应用。

在Matlab中,我们可以使用Laplacian算子对图像进行处理并得到边缘信息。

本文将介绍如何使用Matlab编写Laplacian算子的程序,并展示算法在图像处理中的实际应用。

Laplacian算子的定义如下:L(x, y) = ∂²I(x, y)/∂x² + ∂²I(x, y)/∂y²其中,L(x, y)是Laplacian算子的输出,I(x, y)是输入图像,∂²I(x, y)/∂x²和∂²I(x, y)/∂y²分别是图像在水平和竖直方向上的二阶导数。

在Matlab中,我们可以使用内置的函数`fspecial`和`imfilter`实现Laplacian算子。

具体步骤如下:步骤1:读取图像首先,我们需要读取一幅图像作为输入。

可以使用`imread`函数读取图像,并使用`imshow`函数显示图像。

```matlabimage = imread('input.jpg');imshow(image);```步骤2:构造Laplacian算子的卷积核在Matlab中,我们可以使用`fspecial`函数构造一个Laplacian算子的卷积核。

Laplacian算子的卷积核通常取如下形式:```0 -1 0-1 4 -10 -1 0```可以使用`fspecial('laplacian')`函数生成Laplacian算子的卷积核。

为了增强边缘效果,我们可以对卷积核进行归一化处理,使其元素之和为1。

```matlablaplacian = fspecial('laplacian');laplacian = laplacian / sum(abs(laplacian(:)));```步骤3:应用Laplacian算子使用`imfilter`函数将Laplacian算子应用到图像上。

基于MATLAB GUI图像处理系统的设计与实现

基于MATLAB GUI图像处理系统的设计与实现

基于MATLAB GUI图像处理系统的设计与实现本文将介绍一个基于MATLAB GUI的图像处理系统的设计和实现。

该系统提供了一系列常用的图像处理功能,包括图像滤波、边缘检测、图像变换、形态学处理、颜色空间转换等。

通过该系统,用户可以方便地对图像进行处理和分析。

首先,需要创建一个MATLAB GUI窗口,用于显示图像和进行图像处理。

接着,通过调用MATLAB内置的图像处理函数来实现各种功能。

下面是一些常用功能的实现方法:1.图像读取:使用imread函数来读取图像文件,并在GUI窗口中显示。

2.图像滤波:使用imfilter函数来实现各种滤波器,如高斯滤波、中值滤波等。

3.边缘检测:使用边缘检测算法(如Sobel算子、Canny算法等)来提取图像中的边缘信息。

4.图像变换:使用imresize函数来改变图像的大小,使用imrotate函数来旋转图像等。

5.形态学处理:使用imopen、imclose等形态学处理函数来对图像进行形态学分析和处理。

6.颜色空间转换:使用rgb2gray、rgb2hsv等函数来进行颜色空间的转换。

在实现这些功能时,可以使用MATLAB的图像处理工具箱中的函数,也可以自己编写函数来实现特定的处理功能。

除了提供以上的基本功能,该系统还可以通过添加菜单栏、工具栏等交互元素,以增强用户体验。

例如,添加一个“保存”菜单项,使用户可以将处理后的图像保存到本地,或添加一个“撤销”按钮,使用户可以取消上一次的处理操作等。

总之,通过将MATLAB GUI和图像处理技术相结合,我们可以很方便地开发出一个图像处理系统,并提供常用的功能和交互元素,使用户可以快速地对图像进行处理和分析。

同时,我们也可以根据实际需要,自行扩展和改进该系统,以适应更加复杂的图像处理应用场景。

Matlab在边缘检测与边界提取中的应用

Matlab在边缘检测与边界提取中的应用

Matlab在边缘检测与边界提取中的应用在计算机视觉领域中,边缘检测与边界提取是非常重要的任务。

边缘是图像中物体不同区域之间的分界线,边界提取则是通过检测图像中的边缘,从而凸显物体的轮廓。

边缘检测与边界提取在许多应用中都发挥着重要作用,如图像分割、目标识别和机器视觉等。

Matlab是一种功能强大且流行的科学计算软件,它提供了许多用于边缘检测和边界提取的工具和函数。

下面将介绍一些常用的Matlab函数和技术,它们在边缘检测与边界提取中的应用。

一、基于梯度的边缘检测梯度是表示图像中变化的指标,边缘通常是图像灰度值变化剧烈的区域。

Matlab中的Sobel、Prewitt和Roberts等函数可以方便地计算图像的梯度,从而实现边缘检测。

例如,使用Sobel算子可以对图像进行边缘检测:```I = imread('image.jpg');gray = rgb2gray(I);sobel_x = edge(gray, 'sobel', 'horizontal');sobel_y = edge(gray, 'sobel', 'vertical');imshowpair(sobel_x, sobel_y, 'montage');```上述代码首先加载并灰度化图像,然后使用Sobel算子分别计算水平和垂直方向上的梯度。

最后,使用imshowpair函数将水平和垂直边缘结果以并排的方式展示出来。

二、基于Canny算法的边缘检测Canny算法是一种广泛应用于边缘检测的算法,它通过多步骤的处理来准确地检测边缘。

在Matlab中,可以使用edge函数以及一些参数来实现Canny算法。

下面是一个使用Canny算法进行边缘检测的示例:```I = imread('image.jpg');gray = rgb2gray(I);canny = edge(gray, 'canny');imshow(canny);```上述代码中,首先加载并灰度化图像,然后使用edge函数采用Canny算法进行边缘检测。

Matlab实现:图像边缘提取

Matlab实现:图像边缘提取

Matlab实现:图像边缘提取1、边缘提取算法⽅法⼀:⼀阶微分算⼦Sobel算⼦Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,Sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素。

Roberts算⼦Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确。

Prewitt算⼦Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。

但边缘较宽,⽽且间断点多。

Canny算⼦Canny算⼦是⽬前边缘检测最常⽤的算法,效果也是最理想的。

Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。

优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

⽅法⼆:⼆阶微分算⼦Laplacian算⼦Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区。

2、实验结果分析⼀、边缘提取:Sobel算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好,sobel算⼦对边缘定位不是很准确,图像的边缘不⽌⼀个像素;Roberts算⼦检测⽅法对具有陡峭的低噪声的图像处理效果较好,但是利⽤roberts算⼦提取边缘的结果是边缘⽐较粗,因此边缘的定位不是很准确;Prewitt算⼦检测⽅法对灰度渐变和噪声较多的图像处理效果较好。

但边缘较宽,⽽且间断点多;Laplacian算⼦法对噪声⽐较敏感,所以很少⽤该算⼦检测边缘,⽽是⽤来判断边缘像素视为与图像的明区还是暗区;Canny⽅法不容易受噪声⼲扰,能够检测到真正的弱边缘。

优点在于,使⽤两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

⼆、边缘复合增强Sobel、Robert、Prewitt算⼦的增强效果并不是很明显,尤其是Robert算⼦,因为它提取的边缘点过于稀疏和离散;Laplacian算⼦和canny算⼦的增强效果都⽐较理想,将边缘叠加上去后,整个⼿的轮廓和边缘都很清晰,直观上看,canny算⼦实现的效果⽐Laplacian算⼦好,最明显的地⽅就是⼿指尖的边缘。

关于MATLAB边缘检测sobel算子

关于MATLAB边缘检测sobel算子

关于MATLAB边缘检测sobel算子一、sobel介绍索贝尔算子是图像处理中的算子之一,主要用作边缘检测。

在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。

在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。

如果以代表原始图像,及分别代表经横向及纵向边缘检测的图像,其公式如下:图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

然后可用以下公式计算梯度方向。

在以上例子中,如果以上的角度等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

二、程序例1clear all;close all;f=imread('dsy.jpg');u=rgb2gray(f);F=double(f);U=double(u);[H,W]=size(u);uSobel=u;% ms=0;% ns=0;for i=2:H-1for j=2:W-1Gx=(U(i+1,j-1)+2*U(i+1,j)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i-1,j)+F(i-1,j+1));Gy=(U(i-1,j+1)+2*U(i,j+1)+F(i+1,j+1))-(U(i-1,j-1)+2*U(i,j-1)+F(i+1,j-1));uSobel(i,j)=sqrt(Gx^2+Gy^2);% ms=ms+uSobel(i,j);% ns=ns+(uSobel(i,j)-ms)^2;endend% ms=ms/(H*W);% ns=ns/(H*W);subplot(1,2,1);imshow(f);title('原图');subplot(1,2,2);imshow(im2uint8(uSobel));title('Sobel处理后');% S=[ms ns];程序运行结果:例2hg=zeros(3,3); %设定高斯平滑滤波模板的大小为3*3delta=0.5;for x=1:1:3for y=1:1:3u=x-2;v=y-2;hg(x,y)=exp(-(u^2+v^2)/(2*pi*delta^2));endendh=hg/sum(hg(:));g = imread('jjj.jpg ');f=rgb2gray(im2double(g));subplot(2,2,1),imshow(f)title('原始图像');[m,n]=size(f);ftemp=zeros(m,n);rowhigh=m-1;colhigh=n-1;%%%高斯滤波%%%for x=2:1:rowhigh-1for y=2:1:colhigh-1mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];A=h.*mod;ftemp(x,y)=sum(A(:));endendf=ftempsubplot(2,2,2),imshow(f)title('高斯滤波器后的图像');%%%%3*3的soble算子%%%%%%%%sx=[-1 -2 -1;0 0 0;1 2 1];sy=[-1 0 1;-2 0 2;-1 0 1];for x=2:1:rowhigh-1for y=2:1:colhigh-1mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];fsx=sx.*mod;fsy=sy.*mod;ftemp(x,y)=max((abs(sum(fsx(:)))),(abs(sum(fsy(:)))));endendfs=im2uint8(ftemp);subplot(2,2,3),imshow(fs)title('用soble检测的原始图像');%%%域值分割%%%TH2=30; %设定阈值for x=2:1:rowhigh-1for y=2:1:colhigh-1if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )fs(x,y)=200;elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y))) fs(x,y)=200;else fs(x,y)=50;endendendsubplot(2,2,4),imshow(fs)title('用soble检测并细化后的图像')。

matlab边缘提取及拟合

matlab边缘提取及拟合

matlab边缘提取及拟合边缘提取及拟合是数字图像处理中的一个重要的步骤。

边缘可以用于图像分割、物体识别、目标跟踪等领域。

本文将介绍边缘提取的常用方法以及拟合方法,并结合MATLAB代码进行讲解。

一、边缘提取方法1. Sobel算子Sobel算子是一种基于梯度的边缘检测算法,其原理是利用像素点周围的灰度值来计算梯度,从而得到边缘。

在MATLAB中,可以使用imgradient函数实现Sobel算子。

代码示例:I = imread('lena.png');[Gx, Gy] = imgradientxy(I);[Gmag, Gdir] = imgradient(Gx, Gy);imshowpair(Gmag, Gdir, 'montage');2. Canny算子Canny算子是一种基于多级阈值的边缘检测算法,其原理是先通过高斯滤波器对图像进行平滑处理,然后计算梯度,再进行非极大值抑制和双阈值分割,最后得到边缘。

在MATLAB中,可以使用edge函数实现Canny算子。

代码示例:I = imread('lena.png');BW = edge(I, 'canny');imshow(BW);二、拟合方法1. 直线拟合直线拟合是一种常用的边缘拟合方法,其原理是通过最小二乘法对边缘点进行拟合,从而得到一条直线。

在MATLAB中,可以使用polyfit函数实现直线拟合。

代码示例:I = imread('lena.png');BW = edge(I, 'canny');[H, T, R] = hough(BW);P = houghpeaks(H, 10);lines = houghlines(BW, T, R, P);imshow(I), hold onmax_len = 0;for k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% Plot beginnings and ends of linesplot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');% Determine the endpoints of the longest line segmentlen = norm(lines(k).point1 - lines(k).point2);if ( len > max_len)max_len = len;xy_long = xy;endend2. 圆拟合圆拟合是一种边缘拟合方法,其原理是通过最小二乘法对边缘点进行拟合,从而得到一个圆。

matlab边缘检测代码

matlab边缘检测代码

MATLAB边缘检测代码边缘检测是图像处理中常用的技术,用于识别图像中物体的轮廓。

在MATLAB中,我们可以使用不同的方法进行边缘检测,例如Sobel算子、Canny算子等。

本文将介绍MATLAB中常用的边缘检测方法,并给出相应的代码示例。

1. Sobel算子Sobel算子是一种基于梯度的边缘检测算法,通过计算图像灰度值的一阶导数来识别边缘。

在MATLAB中,我们可以使用edge函数来实现Sobel算子。

img = imread('image.jpg'); % 读取图像gray_img = rgb2gray(img); % 将彩色图像转换为灰度图像edge_img = edge(gray_img, 'sobel'); % 使用Sobel算子进行边缘检测imshow(edge_img); % 显示结果上述代码首先读取一张彩色图像,并将其转换为灰度图像。

然后使用edge函数对灰度图像进行Sobel边缘检测,并将结果显示出来。

2. Canny算子Canny算子是一种基于多阶段处理的边缘检测算法,它能够有效地抑制噪声并提取出清晰、准确的边缘。

在MATLAB中,我们同样可以使用edge函数来实现Canny算子。

img = imread('image.jpg'); % 读取图像gray_img = rgb2gray(img); % 将彩色图像转换为灰度图像edge_img = edge(gray_img, 'canny'); % 使用Canny算子进行边缘检测imshow(edge_img); % 显示结果上述代码与Sobel算子的示例代码类似,只是将edge函数的第二个参数设置为'canny'来使用Canny算子进行边缘检测。

3. Laplacian算子Laplacian算子是一种基于二阶导数的边缘检测算法,它能够检测出图像中的灰度变化区域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《图像处理中的数学方法》实验报告学生姓名:赵芳舟教师姓名:曾理学院:数学与统计学院专业:信息与计算科学学号:联系方式:梯度和拉普拉斯算子在图像边缘检测中的应用一、数学方法边缘检测最通用的方法是检测灰度值的不连续性,这种不连续性用一阶和二阶导数来检测。

1.(1)一阶导数:一阶导数即为梯度,对于平面上的图像来说,我们只需用到二维函数的梯度,即:,该向量的幅值:,为简化计算,省略上式平方根,得到近似值;或通过取绝对值来近似,得到:。

(2)二阶导数:二阶导数通常用拉普拉斯算子来计算,由二阶微分构成:2.边缘检测的基本思想:(1)寻找灰度的一阶导数的幅度大于某个指定阈值的位置;(2)寻找灰度的二阶导数有零交叉的位置。

3.几种方法简介(1)Sobel边缘检测器:以差分来代替一阶导数。

Sobel边缘检测器使用一个3×3邻域的行和列之间的离散差来计算梯度,其中,每行或每列的中心像素用2来加权,以提供平滑效果。

-1-21000121-101-202-101(2)Prewitt边缘检测器:使用下图所示模板来数字化地近似一阶导数。

与Sobel检测器相比,计算上简单一些,但产生的结果中噪声可能会稍微大一些。

-1-1-1000111-101-101-101(3)Roberts边缘检测器:使用下图所示模板来数字化地将一阶导数近似为相邻像素之间的差,它与前述检测器相比功能有限(非对称,且不能检测多种45°倍数的边缘)。

-10010-110(4)Laplace边缘检测器:二维函数的拉普拉斯是一个二阶的微分定义:0101-41010(八邻域)(5)LoG边缘检测器由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的是LoG算子,即Laplacian-Guass算子。

引入高斯函数来平滑噪声:该函数的Laplace算子:它把Guass平滑滤波器和Laplace锐化滤波器结合起来,先平滑掉噪声,再进行边缘检测,所以效果比单用Laplace算子要更为平滑,效果更好。

(6)Canny边缘检测器主要分为以下几个步骤:①使用具有指定标准差的一个高斯滤波器来平滑图像,以减少噪声;②在每个点处计算局部梯度和边缘方向;③对步骤②中确定的边缘点产生梯度中的脊线顶部进行追踪,并将实际山不在脊线顶部的像素设置为零,从而在输出中给出一条细线(非最大值抑制),然后使用滞后阈值处理法对这些脊线像素进行阈值处理。

最后进行边缘连接。

二、实验结果原始图像:算子算子算子算子(4邻域)(8邻域)5.LoG四种结果的比较:(Laplace采用8邻域模板)图像来源:(网行天下首页>>设计图库>>文化艺术>>插画集:《牧羊犬灰度》)图像规格:800×677 格式:SVG 模式:RGB硬件条件:软件条件:运行环境:Matlab r2015b三、讨论1.各方法优缺点及比较:(1)Roberts算子:Roberts算子是2×2算子,对具有陡峭的低噪声图像响应最好,并且检测垂直边缘的效果好于斜向边缘,定位精度高。

然而,它对噪声敏感,无法抑制噪声的影响。

因此,它适用于边缘明显且噪声较少的图像分割。

(2)Prewitt算子:Prewitt算子将两个点的各自一定领域内的灰度值求和,并根据两个灰度值和的差来计算x,y的偏导数。

它是平均滤波,对噪声有抑制作用,对于灰度渐变的低噪声图像有较好的检测效果,但是像素平均相当于对图像的低通滤波,所以它对边缘的定位不如Roberts算子。

对于混合多复杂噪声的图像,效果不太理想。

(3)Sobel算子:Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。

美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,即Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。

(4)Laplace算子:Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。

Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。

存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。

(5)LoG算子:由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。

所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。

(6)Canny算子:是一个具有滤波,增强和检测的多阶段的优化算子,在进行处理前,Canny 算子先利用高斯平滑滤波器来平滑图像以消除噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度的幅值和方向。

在处理过程中,Canny算法还将经过一个非极大值抑制的过程。

最后Canny算法将采用两个阈值来连接边缘。

高定位精度、低误判率、抑制虚假边缘,适用于高噪声图像。

四、实际应用1、概述:图像边缘检测广泛应用于车牌识别,人脸识别,地震带检测,生物医疗以及产品外观检测等方面。

为了体现其实际应用,在此针对车牌识别来进行实验,实验流程如下:3、实验结果原图像:灰度处理:将彩色图像转化为灰度图像,缩小图片占用的空间,减少处理时间边缘检测:车牌区域的边缘信息一般比其他部分丰富且集中,只要 背景不太复杂,没有过多干扰,边缘特征可将车牌区域与其他部分区别开来,从而消除图像中的无关信息。

腐蚀和膨胀:腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割最后将车牌号分割成七个单个字符,建立模板库,与其进行配对,最终得出结果。

五、程序介绍(1) Roberts 边缘检测clear;sourcePic=imread('C:\Users\34899\Desktop\'); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts 算子计算得到的每个像素的值robertThreshold=; %设定阈值for j=1:m-1 %进行边界提取for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) +abs(grayPic(j+1,k)-grayPic(j,k+1));if(robertsNum > robertThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendsubplot(1,2,1);imshow(sourcePic);title('原图');subplot(1,2,2);imshow(newGrayPic);title('Robert算子处理后图像');(2)Prewitt边缘检测clear;sourcePic=imread('C:\Users\34899\Desktop\'); %读取原图像grayPic=mat2gray(sourcePic);%实现图像矩阵的归一化操作[m,n]=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素PrewittNum=0;%经Prewitt算子计算得到的每个像素的值PrewittThreshold=;%设定阈值for j=2:m-1 %进行边界提取for k=2:n-1PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k+1)+g rayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1));if(PrewittNum > PrewittThreshold)newGrayPic(j,k)=255;elsenewGrayPic(j,k)=0;endendendsubplot(1,2,1);imshow(sourcePic);title('原图');subplot(1,2,2);imshow(newGrayPic);title('Prewitt算子处理后图像');(3)Sobel边缘检测clear all;close all;imag = imread('C:\Users\34899\Desktop\'); %读取关键帧imag = rgb2gray(imag); %转化为灰度图subplot(1,2,1);imshow(imag);title('原图');[high,width] = size(imag); % 获得图像的高度和宽度F2 = double(imag);U = double(imag);uSobel = imag;for i = 2:high - 1 %sobel边缘检测for j = 2:width - 1Gx = (U(i+1,j-1) + 2*U(i+1,j) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i-1,j) + F2(i-1,j+1));Gy = (U(i-1,j+1) + 2*U(i,j+1) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i,j-1) + F2(i+1,j-1));uSobel(i,j) = sqrt(Gx^2 + Gy^2);endendsubplot(1,2,2);imshow(im2uint8(uSobel)):title('Sobel边缘检测后');(4)Laplace边缘检测主函数:f=imread('C:\Users\34899\Desktop\')fGray=rgb2gray(f);figure()imshow(fGray),title('灰度图像');fGray=double(fGray);T=60;LapModType=8;%设置laplace模板方式fLapEdge=LaplaceEdge(fGray,LapModType,T);fGrayLapEdge=uint8(fLapEdge);figure()imshow(fLapEdge),title('laplace边缘图像');四邻域算子和八邻域算子function fLapEdge=LaplaceEdge(fGray,MoldType,Thresh)%-------------------------参数介绍-----------------%输入参数:% fGray;输入的灰度图像% MoldType:模板类型,包括四邻域和八邻域% Thresh:边缘检测阈值%输出参数:% fEdge:边缘像素点,存储的是二值化图像[r,c]=size(fGray);fLapEdge=zeros(r,c);%四邻域拉普拉斯边缘检测算子if 4==MoldTypefor i=2:r-1for j=2:c-1Temp=-4*fGray(i,j)+fGray(i-1,j)+fGray(i+1,j)+fGray(i,j-1)+fGray(i,j+1);if Temp>ThreshfLapEdge(i,j)=255;elsefLapEdge(i,j)=0;endendendend%八邻域拉普拉斯边缘检测算子if 8==MoldTypefor i=2:r-1for j=2:c-1Temp=-8*fGray(i,j)+fGray(i-1,j)+fGray(i+1,j)+fGray(i,j-1)+fGray(i,j+1)+fGray(i-1,j-1)+fGray(i+1,j+1)+fGray(i+1,j-1)+fGray(i-1,j+1);if Temp>ThreshfLapEdge(i,j)=255;elsefLapEdge(i,j)=0;endendendEnd(5)拉普拉斯—高斯检测器clc; clear all;close all;hsize = [5 5];sigma = ;h = fspecial('log', hsize, sigma);I = imread('C:\Users\34899\Desktop\');bw = imfilter(I, h, 'replicate');figure;subplot(1, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold');subplot(1, 2, 2); imshow(bw, []); title('边缘图像', 'FontWeight', 'Bold');(6)Canny算子tic % 记录CPU使用时间,开始计时I = imread('C:\Users\34899\Desktop\'); % 读入图像I=rgb2gray(I); % 转化为灰色图像% figure,imshow(I);title('原图') % 显示原图像% a = im2single(I); % 将图像矩阵转换为单精度类型% a = im2uint8(a); % 将图像矩阵转换为8位无符号整数类型% I = uint16(I); % 8位无符号整数转化为16位无符号整数%**************************** matlab的高斯平滑 **************************** [row,line] = size(I); % 行列temp = zeros(row+8,line+8); % 申请空间imagedata = zeros(row,line); % 申请空间% 高斯核计算,核大小为9*9GaussianDieOff = .0001;sigma = 1;pw = 1:30; % possible widthsssq = sigma^2;width = find(exp(-(pw.*pw)/(2*ssq))>GaussianDieOff,1,'last');if isempty(width)width = 1; % the user entered a really small sigmaendt = (-width:width);gau = exp(-(t.*t)/(2*ssq))/(2*pi*ssq);kernel = gau' * gau; % 高斯核,大小为9*9kernel = im2single(kernel);% 图像边缘复制for q = 5:row+4 % 首先载入源图像信息for p = 5:line+4temp(q,p) = I(q-4,p-4);endendfor q = 1:row+8 % 复制列5:line+4for p = 5:line+4if(q<5)temp(q,p) = temp(5,p);endif(q>row+4)temp(q,p) = temp(row+4,p);endendendfor q = 1:row+8 % 复制行1:row+8for p = 1:line+8if(p<5)temp(q,p) = temp(q,5);endif(p>line+4)temp(q,p) = temp(q,line+4);endendendfor q = 1:row % 高斯卷积for p = 1:linefor n = 1:9for m = 1:9imagedata(q,p) = imagedata(q,p) + kernel(n,m) * temp(q+n-1,p+m-1);endendendend%************************ matlab的高斯平滑说明结束 ************************%****************************** matlab求梯度 ******************************dx = zeros(size(I)); % 申请空间,存放x方向的幅值dy = zeros(size(I)); % 申请空间,存放y方向的幅值[x,y]=meshgrid(-width:width,-width:width);dgau2D=-x.*exp(-(x.*x+y.*y)/(2*ssq))/(pi*ssq); % 核% 图像边缘复制for q = 5:row+4 % 首先载入源图像信息for p = 5:line+4temp(q,p) = imagedata(q-4,p-4);endendfor q = 1:row+8 % 复制列5:line+4for p = 5:line+4if(q<5)temp(q,p) = temp(5,p);endif(q>row+4)temp(q,p) = temp(row+4,p);endendendfor q = 1:row+8 % 复制行1:row+8for p = 1:line+8if(p<5)temp(q,p) = temp(q,5);endif(p>line+4)temp(q,p) = temp(q,line+4);endendendfor q = 1:row % x方向卷积for p = 1:linefor n = 1:9for m = 1:9dx(q,p) = dx(q,p) + dgau2D(n,m) * temp(q+n-1,p+m-1);endendendenddgau2D = dgau2D';for q = 1:row % y方向卷积for p = 1:linefor n = 1:9for m = 1:9dy(q,p) = dy(q,p) + dgau2D(n,m) * temp(q+n-1,p+m-1);endendendend%**************************** matlab求梯度结束 ****************************%***************************** 自适应阈值计算 ***************************** value = sqrt(dx.^2 + dy.^2); % 幅值value = double(value);value = value/max(max(value));% 归一化temp_value = value;counts=imhist(value, 64);high_threshold = find(cumsum(counts) > *row*line,1,'first') / 64;low_threshold = * high_threshold; % 低阈值clear counts%*************************** 自适应阈值计算结束 ***************************%***************************** 方向与阈值判别 ***************************** num = 0; % 当前堆栈个数flag = zeros(80000,2); % 堆栈temp_flag = zeros(80000,2); % 临时堆栈imagedata = zeros(row,line); % 初始化% 方向:% 0为0°~45°% 1为45°~90°% 2为90°~135°% 3为135°~180°direction = zeros(size(I)); % 申请空间,存放小于高阈值而大于低阈值for q = 2:row-1for p = 2:line-1if((dy(q,p)<=0 && dx(q,p)>-dy(q,p)) || (dy(q,p)>=0 && dx(q,p)<-dy(q,p))) d = abs(dy(q,p)/dx(q,p)); % 0°~45°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q,p+1)*(1-d) + temp_value(q-1,p+1)*d;gradmag2 = temp_value(q,p-1)*(1-d) + temp_value(q+1,p-1)*d;elseif((dx(q,p)>0 && -dy(q,p)>=dx(q,p)) || (dx(q,p)<0 && -dy(q,p)<=dx(q,p))) d = abs(dx(q,p)/dy(q,p)); % 45°~90°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q-1,p)*(1-d) + temp_value(q-1,p+1)*d;gradmag2 = temp_value(q+1,p)*(1-d) + temp_value(q+1,p-1)*d;elseif((dx(q,p)<=0 && dx(q,p)>dy(q,p)) || (dx(q,p)>=0 && dx(q,p)<dy(q,p))) d = abs(dx(q,p)/dy(q,p)); % 90°~135°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q-1,p)*(1-d) + temp_value(q-1,p-1)*d;gradmag2 = temp_value(q+1,p)*(1-d) + temp_value(q+1,p+1)*d;elseif((dy(q,p)<0 && dx(q,p)<=dy(q,p)) || (dy(q,p)>0 && dx(q,p)>=dy(q,p))) d = abs(dy(q,p)/dx(q,p)); % 135°~180°方向gradmag = temp_value(q,p);gradmag1 = temp_value(q,p-1)*(1-d) + temp_value(q-1,p-1)*d;gradmag2 = temp_value(q,p+1)*(1-d) + temp_value(q+1,p+1)*d;endif(gradmag>=gradmag1 && gradmag>=gradmag2)if(gradmag >= high_threshold) % 高阈值判别value(q,p) = 255;elseif(gradmag >= low_threshold)% 低阈值判别value(q,p) = 125;elsevalue(q,p) = 0; % 小于低阈值endelsevalue(q,p) = 0; % 非极大值抑制endendendfor q = 2:row-1 % 高阈值判别,检查高阈值邻域8个方向范围内是否存在低阈值for p = 2:line-1if(value(q,p) == 255)imagedata(q,p) = 255;if(value(q-1,p-1) == 125)value(q-1,p-1) = 255;imagedata(q-1,p-1) = 255;if((q-1 > 1) && (p-1 > 1))num = num + 1;flag(num,1) = q-1;flag(num,2) = p-1;endendif(value(q-1,p) == 125)value(q-1,p) = 255;imagedata(q-1,p) = 255;if(q-1 > 1)num = num + 1;flag(num,1) = q-1;flag(num,2) = p;endendif(value(q-1,p+1) == 125)value(q-1,p+1) = 255;imagedata(q-1,p+1) = 255;if((q-1 > 1) && (p+1 < line)) num = num + 1;flag(num,1) = q-1;flag(num,2) = p+1;endendif(value(q,p-1) == 125)value(q,p-1) = 255;imagedata(q,p-1) = 255;if(p-1 > 1)num = num + 1;flag(num,1) = q;flag(num,2) = p-1;endendif(value(q,p+1) == 125)value(q,p+1) = 255;imagedata(q,p+1) = 255;if(p+1 < line)num = num + 1;flag(num,1) = q;flag(num,2) = p+1;endendif(value(q+1,p-1) == 125)value(q+1,p-1) = 255;imagedata(q+1,p-1) = 255;if((q+1 < row) && (p-1 > 1))num = num + 1;flag(num,1) = q+1;flag(num,2) = p-1;endendif(value(q+1,p) == 125)value(q+1,p) = 255;imagedata(q+1,p) = 255;if(q+1 < row)num = num + 1;flag(num,1) = q+1;flag(num,2) = p;endendif(value(q+1,p+1) == 125)value(q+1,p+1) = 255;imagedata(q+1,p+1) = 255;if((q+1 < row) && (p+1 < line)) num = num + 1;flag(num,1) = q+1;flag(num,2) = p+1;endendendendenddone = num; % 完成标志,等于0表示当前连线已完成while done ~= 0num = 0;for temp_num = 1:doneq = flag(temp_num,1);p = flag(temp_num,2);if(value(q-1,p-1) == 125)value(q-1,p-1) = 255;imagedata(q-1,p-1) = 255;if((q-1 > 1) && (p-1 > 1))num = num + 1;temp_flag(num,1) = q-1;temp_flag(num,2) = p-1;endendif(value(q-1,p) == 125)value(q-1,p) = 255;imagedata(q-1,p) = 255;if(q-1 > 1)num = num + 1;temp_flag(num,1) = q-1; temp_flag(num,2) = p;endendif(value(q-1,p+1) == 125)value(q-1,p+1) = 255;imagedata(q-1,p+1) = 255;if((q-1 > 1) && (p+1 < line)) num = num + 1;temp_flag(num,1) = q-1; temp_flag(num,2) = p+1;endendif(value(q,p-1) == 125)value(q,p-1) = 255;imagedata(q,p-1) = 255;if(p-1 > 1)num = num + 1;temp_flag(num,1) = q;temp_flag(num,2) = p-1;endendif(value(q,p+1) == 125)value(q,p+1) = 255;imagedata(q,p+1) = 255;if(p+1 < line)num = num + 1;temp_flag(num,1) = q;temp_flag(num,2) = p+1;endendif(value(q+1,p-1) == 125)value(q+1,p-1) = 255;imagedata(q+1,p-1) = 255;if((q+1 < row) && (p-1 > 1)) num = num + 1;temp_flag(num,1) = q+1; temp_flag(num,2) = p-1;endendif(value(q+1,p) == 125)value(q+1,p) = 255;imagedata(q+1,p) = 255;if(q+1 < row)num = num + 1;temp_flag(num,1) = q+1;temp_flag(num,2) = p;endendif(value(q+1,p+1) == 125)value(q+1,p+1) = 255;imagedata(q+1,p+1) = 255;if((q+1 < row) && (p+1 < line))num = num + 1;temp_flag(num,1) = q+1;temp_flag(num,2) = p+1;endendenddone = num;flag = temp_flag;end%*************************** 方向与阈值判别结束 ***************************%****************************** 目标图像显示 ****************************** imagedata = uint8(imagedata); % 16位无符号整数转化为8位无符号整数figure,imshow(imagedata);title('canny算子检测后') % 显示非极大值抑制后的图像clear all%**************************** 目标图像显示结束 ****************************toc % 记录CPU使用时间,结束计时(7)车牌号识别2:代码(主函数):function [d]=main(jpg)close allclcI=imread('C:\Users\34899\Desktop\');figure(1),imshow(I);title('原图')I1=rgb2gray(I);figure(2),subplot(1,2,1),imshow(I1);title('灰度图');figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%I2=edge(I1,'robert',,'both');%figure(3),imshow(I2);title('robert算子边缘检测')sourcePic=imread('C:\Users\34899\Desktop\'); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作[m,n]=size(grayPic);I2=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=; %设定阈值for j=1:m-1 %进行边界提取for k=1:n-1robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));if(robertsNum > robertThreshold)I2(j,k)=255;elseI2(j,k)=0;endendendfigure(3),imshow(I2);title('Roberts算子检测后图像');se=[1;1;1];I3=imerode(I2,se);figure(4),imshow(I3);title('腐蚀后图像');se=strel('rectangle',[25,25]);I4=imclose(I3,se);figure(5),imshow(I4);title('平滑图像的轮廓');I5=bwareaopen(I4,2000);%figure(6),mesh(I5);title('从对象中移除小对象');[y,x,z]=size(I5);myI=double(I5);ticBlue_y=zeros(y,1);for i=1:yfor j=1:xif(myI(i,j,1)==1)Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计endendend[temp MaxY]=max(Blue_y);%Y方向车牌区域确定PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;endPY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%%%%%% X方向 %%%%%%%%%Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1;endendendPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;endPX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'');[filename,filepath]=uigetfile('','输入一个定位裁剪后的车牌图像');jpg=strcat(filepath,filename);a=imread('');b=mat2gray(a);imwrite(b,'1.车牌灰度图像.jpg');figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')g_max=double(max(max(b)));g_min=double(min(min(b)));%T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值T=;[m,n]=size(b);d=(double(b)>=T); % d:二值图像imwrite(d,'2.车牌二值图像.jpg');figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像')figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前')% 滤波h=fspecial('average',3);d=im2bw(round(filter2(h,d)));imwrite(d,'4.均值滤波后.jpg');figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后')% 某些图像进行操作% 膨胀或腐蚀% se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀% 'line'/'diamond'/'ball'...se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵[m,n]=size(d);if bwarea(d)/m/n>=d=imerode(d,se);elseif bwarea(d)/m/n<=d=imdilate(d,se);endimwrite(d,'5.膨胀或腐蚀处理后.jpg');figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割d=qiege(d);[m,n]=size(d);figure,subplot(2,1,1),imshow(d),title(n)k1=1;k2=1;s=sum(d);j=1;while j~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/[val,num]=min(sum(d(:,[k1+5:k2-5])));d(:,k1+num+5)=0; % 分割endend% 再切割d=qiege(d);% 切割出 7 个字符y1=10;y2=;flag=0;word1=[];while flag==0[m,n]=size(d);left=1;wide=0;while sum(d(:,wide+1))~=0wide=wide+1;endif wide<y1 % 认为是左侧干扰d(:,[1:wide])=0;d=qiege(d);elsetemp=qiege(imcrop(d,[1 1 wide m]));[m,n]=size(temp);all=sum(sum(temp));two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));if two_thirds/all>y2flag=1;word1=temp; % WORD 1endd(:,[1:wide])=0;d=qiege(d);endend% 分割出第二个字符[word2,d]=getword(d);% 分割出第三个字符[word3,d]=getword(d);% 分割出第四个字符[word4,d]=getword(d);% 分割出第五个字符[word5,d]=getword(d);% 分割出第六个字符[word6,d]=getword(d);% 分割出第七个字符[word7,d]=getword(d);subplot(5,7,1),imshow(word1),title('1');subplot(5,7,2),imshow(word2),title('2');subplot(5,7,3),imshow(word3),title('3');subplot(5,7,4),imshow(word4),title('4');subplot(5,7,5),imshow(word5),title('5');subplot(5,7,6),imshow(word6),title('6');subplot(5,7,7),imshow(word7),title('7');[m,n]=size(word1);% 商用系统程序中归一化大小为 40*20,此处演示word1=imresize(word1,[40 20]);word2=imresize(word2,[40 20]);word3=imresize(word3,[40 20]);word4=imresize(word4,[40 20]);word5=imresize(word5,[40 20]);word6=imresize(word6,[40 20]);word7=imresize(word7,[40 20]);subplot(5,7,15),imshow(word1),title('1');subplot(5,7,16),imshow(word2),title('2');subplot(5,7,17),imshow(word3),title('3');subplot(5,7,18),imshow(word4),title('4');subplot(5,7,19),imshow(word5),title('5');subplot(5,7,20),imshow(word6),title('6');subplot(5,7,21),imshow(word7),title('7');imwrite(word1,'');imwrite(word2,'');imwrite(word3,'');imwrite(word4,'');imwrite(word5,'');imwrite(word6,'');imwrite(word7,'');liccode=char(['0':'9''A':'Z''苏豫陕鲁']); %建立自动识别字符代码表SubBw2=zeros(40,20);l=1;for I=1:7ii=int2str(I);t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');if l==1 %第一位汉字识别kmin=37;kmax=40;elseif l==2 %第二位 A~Z 字母识别kmin=11;kmax=36;else l>=3 %第三位以后是字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat('字符模板\',liccode(k2),'.jpg');SamBw2 = imread(fname);for i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend% 以上相当于两幅图相减得到第三幅图Dmax=0;for k1=1:40for l1=1:20if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 )Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);MinError=min(Error1);findc=find(Error1==MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;endfigure(10),imshow(dw),title (['车牌号码:', Code],'Color','b');六、参考文献【1】Rafeal 、Richard 、Steven ,数字图像处理,第二版,2014,电子工业出版社【2】【3】【4】【5】【6】【7】。

相关文档
最新文档