图像边缘检测各种算子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算子是一种基于二阶导数的边缘检测算法,它能够检测出图像中的灰度变化区域。

基于Matlab的几种常用边缘检测算子的研究

基于Matlab的几种常用边缘检测算子的研究

基于Matlab的几种常用边缘检测算子的研究摘要:图像边缘检测一直以来都是图像处理与分析领域的研究热点,首先简单介绍了边缘检测的原理,重点对具有代表性的图像边缘提取方法进行了讨论,分析了这些算子进行边缘检测的优缺点,以及导致它们效果差异的具体原因。

为了更清楚看出效果,针对标准例图,利用matlab软件,给出了这些算法的仿真实验效果,最后对实验结果进行了分析,这对进一步学习和寻找更好的熟悉图像边缘检测方法具有一定的指导意义。

关键词:边缘检测;robert算子;prewitt算子;sobel算子0 引言在数字图像中,边缘(edge)是指图像局部强度变化最显著的部分,主要存在于目标与背景之间,目标与目标之间和区域与区域(包括不同色彩)之间。

边缘是图像最基本的特征之一,通过对边缘的检测,大大了减少所要处理的图像信息,但是又保留了图像中的物体形状信息,因而边缘检测在图像处理和计算机视觉等领域中有着重要的作用,是图像分析、模式识别的重要部分。

1 边缘检测的原理边缘检测就是利用模板对图像矩阵进行卷积运算。

卷积运算:将用到的图像区域中的每个像素分别于模板(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值。

反映到公式上就是:R=R\-1[]R\-2[]R\-3R\-4[]R\-6[]R\-6R\-7[]R\-8[]R\-9卷积G=G\-1[]G\-2[]G\-3G\-4[]G\-6[]G\-6G\-7[]G\-8[]G\-9图像矩阵模板R\-5(中心像素)=R\-1G\-1+R\-2G\-2+R\-3G\-3+R\-4G\-4+R\-5G\-5+R\-6G\-6+R\-7G\-7+R\-8G\-8+R\-9G\-9为了容易理解边缘检测的原理,本文利用的是一个模板,但对于一个连续图像函数f(x,y),它的一阶导数为两个:分别为沿x轴的Gx和沿y轴的Gy,因此在实际应用中通常利用两个模板来分别进行卷积运算,再取其最大值作为该像素点处的新值。

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

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

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

1.(1)一阶导数:一阶导数即为梯度,对于平面上的图像来说,我们只需用到二维函数的梯度,即:∇f=[g xg y]=[ðf ðxðfðy],该向量的幅值:∇f=mag(∇f)=[g x2+g y2]1/2= [(ðf/ðx)2+(ðf/ðy)2]1/2,为简化计算,省略上式平方根,得到近似值∇f≈g x2+g y2;或通过取绝对值来近似,得到:∇f≈|g x|+|g y|。

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

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

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

∇f=[g x2+g y2]1/2={[(z7+2z8+z9)−(z1+2z2+z3)]2+[(z3+2z6+z9)−(z1+2z4+z7)]2}1/2(2)Prewitt边缘检测器:使用下图所示模板来数字化地近似一阶导数。

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

g x=(z7+z8+z9)−(z1+z2+z3)g y=(z3+z6+z9)−(z1−z4−z7)(3)Roberts边缘检测器:使用下图所示模板来数字化地将一阶导数近似为相邻像素之间的差,它与前述检测器相比功能有限(非对称,且不能检测多种45°倍数的边缘)。

sobel算子检测边缘 matlab编程

sobel算子检测边缘 matlab编程

在MATLAB中,使用Sobel算子检测图像边缘的一个基本例子可以如下:matlab复制代码% 读取图像I = imread('your_image.jpg');% 转换为灰度图像I_gray = rgb2gray(I);% 使用Sobel算子进行边缘检测BW = edge(I_gray,'sobel');% 显示原图像和边缘检测后的图像figure,subplot(1,2,1), imshow(I), title('原图像')subplot(1,2,2), imshow(BW), title('Sobel边缘检测后的图像')在上述代码中,首先读取一个图像,然后将其转换为灰度图像。

然后,使用MATLAB 内置的edge函数,指定'sobel'作为方法参数,对灰度图像进行边缘检测。

最后,显示原始图像和经过Sobel边缘检测后的图像。

注意:你需要将'your_image.jpg'替换为你想要处理的图像的文件名。

如果该文件不在MATLAB的当前工作目录中,你需要提供完整的文件路径。

如果你想自己实现Sobel算子而不是使用内置的edge函数,你可以创建一个Sobel算子,然后将其应用于图像。

这是一个基本的例子:matlab复制代码% 读取图像I = imread('your_image.jpg');% 转换为灰度图像I_gray = rgb2gray(I);% 定义Sobel算子Gx = [-101; -202; -101]; % x方向Gy = [121; 000; -1-2-1]; % y方向% 计算图像大小[height, width] = size(I_gray);% 初始化输出图像Ix = zeros(height-2, width-2);Iy = zeros(height-2, width-2);I_edge = zeros(height-2, width-2);% 应用Sobel算子for i = 2:height-1for j = 2:width-1Ix(i-1,j-1) = sum(sum(double(I_gray(i-1:i+1,j-1:j+1)) .* Gx));Iy(i-1,j-1) = sum(sum(double(I_gray(i-1:i+1,j-1:j+1)) .* Gy));% 计算梯度幅度I_edge(i-1,j-1) = sqrt(Ix(i-1,j-1)^2 + Iy(i-1,j-1)^2);endend% 二值化图像BW = I_edge > threshold; % threshold是一个阈值,你需要自己设定% 显示原图像和边缘检测后的图像figure,subplot(1,2,1), imshow(I), title('原图像')subplot(1,2,2), imshow(BW), title('Sobel边缘检测后的图像')注意:在这个例子中,你需要自己设定一个阈值(threshold)来决定哪些像素被视为边缘。

Matlab技术应用在图像处理领域的介绍

Matlab技术应用在图像处理领域的介绍

Mat1ab技术应用在图像处理领域的介绍图像处理是计算机科学和工程领域的重要研究方向之一。

随着计算机技术的不断发展,图像处理技术也得到了长足的进步和应用。

其中,Mat1ab是一种强大的数字计算和图像处理工具,被广泛应用于图像处理领域。

本文将介绍Mauab技术在图像处理中的应用,包括图像读取、滤波、边缘检测、图像分割和图像识别等方面。

首先,我们来介绍图像读取和显示方面的应用。

MaUab提供了丰富的图像处理函数和工具箱,通过这些函数可以方便地读取和处理图像。

我们可以使用imread函数读取各种格式的图像,例如JPEG、PNG、BMP等。

通过imshow函数可以将读取的图像显示出来,并且可以对图像进行裁剪、旋转和缩放等操作。

此外,MaUab还提供了imwrite函数,用于将图像写入到指定的文件中。

接下来,我们来介绍滤波技术在图像处理中的应用。

滤波是一种常用的图像处理方法,可以用于图像去噪、图像锐化和图像增强等方面。

在MatIab中,有许多滤波函数可供选择,例如均值滤波、中值滤波、高斯滤波等。

这些流波函数能够通过对图像进行卷积运算,从而实现图像的平滑和增强。

此外,MaUab还提供了一些自适应滤波算法,可以根据图像的不同特点进行滤波处理,以得到更好的效果。

然后,我们来介绍边缘检测技术在图像处理中的应用。

边缘检测是图像处理中的一项基础任务,用于提取图像中物体的边界信息。

MatIab提供了多种边缘检测算法,例如Sobe1算子、Canny算子和1叩IaCian算子等。

这些算子可以通过对图像进行卷积运算,从而实现对图像边缘的检测。

通过调整算子的参数,可以得到不同精度和鲁棒性的边缘检测结果。

除了传统的边缘检测方法,Mat1ab还提供了一些基于机器学习和深度学习的边缘检测算法,例如基于卷积神经网络的边缘检测方法。

接着,我们来介绍图像分割技术在图像处理中的应用。

图像分割是一种将图像划分为多个具有相似性质的区域的方法,常用于图像理解和目标检测等任务。

matlab图像处理实验报告

matlab图像处理实验报告

matlab图像处理实验报告Matlab图像处理实验报告引言:图像处理是一门研究如何对图像进行获取、存储、传输、处理和显示的学科。

而Matlab作为一种强大的科学计算软件,被广泛应用于图像处理领域。

本实验报告旨在介绍Matlab在图像处理中的应用。

一、图像获取与显示在图像处理的第一步,我们需要获取图像并进行显示。

Matlab提供了丰富的函数和工具箱来实现这一目标。

我们可以使用imread函数来读取图像文件,imwrite函数来保存图像文件。

而imshow函数则可以用于图像的显示。

通过使用这些函数,我们可以轻松地加载图像文件,并在Matlab中显示出来。

二、图像的基本操作在图像处理中,我们经常需要对图像进行一些基本的操作,如图像的缩放、旋转、裁剪等。

Matlab提供了一系列的函数来实现这些操作。

通过imresize函数,我们可以实现图像的缩放操作。

而imrotate函数则可以用于图像的旋转。

此外,imcrop函数可以用于图像的裁剪。

三、图像的滤波处理图像的滤波处理是图像处理中的重要内容之一。

Matlab提供了多种滤波函数,如均值滤波、中值滤波、高斯滤波等。

这些滤波函数可以用于图像的平滑处理和噪声的去除。

通过调用这些函数,我们可以有效地改善图像的质量。

四、图像的边缘检测边缘检测是图像处理中的一项重要任务,它可以用于提取图像中的边缘信息。

在Matlab中,我们可以使用多种边缘检测算法来实现这一目标,如Sobel算子、Prewitt算子、Canny算子等。

这些算子可以有效地提取图像中的边缘,并将其显示出来。

五、图像的特征提取图像的特征提取是图像处理中的关键步骤之一,它可以用于提取图像中的重要特征。

在Matlab中,我们可以使用各种特征提取算法来实现这一目标,如颜色直方图、纹理特征、形状特征等。

通过提取这些特征,我们可以对图像进行分类、识别等任务。

六、图像的分割与识别图像的分割与识别是图像处理中的热门研究方向之一。

数字图像处理-边缘检测算子与锐化算子(含MATLAB代码)

数字图像处理-边缘检测算子与锐化算子(含MATLAB代码)

数字图像处理实验五15生医一、实验内容对某一灰度图像,进行如下处理:(1)分别用Roberts、Prewitt和Sobel边缘检测算子进行边缘检测;(2)将Roberts、Prewitt和Sobel边缘检测算子修改为锐化算子,对原图像进行锐化,同屏显示原图像、边缘检测结果和锐化后图像,说明三者之间的关系。

一灰度图像的二值化。

二、运行环境MATLAB R2014a三、运行结果及分析运行结果如图所示:可以观察出原图像、边缘检测结果和锐化后图像三者之间的关系为:原图像+边缘检测结果=锐化后图像四、心得体会通过MATLAB编程更加熟悉了课本上关于锐化与边缘检测的相关知识点,对二者的关系也有了具体的认识。

同时,对MATLAB图像导入函数、图像边缘检测函数、锐化窗口矩阵卷积函数的调用及实现机理也有所掌握,比如后边附的程序中会提到的“%”标注的思考。

五、具体程序size=512;Img_rgb=imread('E:\lena.jpg'); %读取图像Img_gray=rgb2gray(Img_rgb); %进行RGB到灰度图像的转换(虽然原来在网上下载的lena就是黑白图像,但是这一步必须要有!否则处理结果不正确)figure(1);subplot(2,3,1);imshow(Img_gray);title('原图像');Img_edge=zeros(size);a={'roberts','prewitt','sobel'};for i=1:3Img_edge=edge(Img_gray,a{i});figure(1);subplot(2,3,i+1);imshow(Img_edge);axis image;title(a(i));endA=imread('E:\lena.jpg');B=rgb2gray(A);B=double(B);Window=[-1-1-1;-19-1;-1-1-1]; %八邻域拉普拉斯锐化算子(α取1)C=conv2(B,Window,'same');Img_sharp=uint8(C);subplot(2,3,5);imshow(Img_sharp);title('sharp');THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。

基于matlab的数字图像边缘检测

基于matlab的数字图像边缘检测

实验二数字图像的边缘检测一、实验目的1.掌握图像边缘检测方法;2.学会利用MATLAB程序进行边缘检测二、实验内容利用sobel、prewitt、canny边缘检测算子对图像进行边缘检测,并比较处理结果三、实验原理边缘即图像中灰度发生急剧变化的区域边界。

边缘检测的实质是采用某种算法来提取图像中对象与背景间的交界线。

图像灰度的变化情况可以用图像灰度分布的梯度来反应,因此可以用局部图像微分技术来获得边缘检测算子。

经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。

常采用差分、梯度、拉普拉斯算子及各种高通滤波处理方法对图像边缘进行检测。

检测的方法有:梯度算子、拉普拉斯算子、方向算子、Canny算子等。

Sobel 算子主要用作边缘检测。

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

在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量Prewitt算子采用以下算子分别计算一阶x 方向和y 方向的图像差分。

在一个较大区域中,用两点的偏导数值来求梯度幅度值,受噪声干扰很大。

若对两个点的各自一定领域内的灰度值求和,并根据两个灰度值和的差来计算x,y的偏导数,则会在很大程度上降低噪声干扰。

Canny 算子使用了变分法,这是一种寻找满足特定功能的函数的方法。

最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。

Canny的目标是找到一个最优的边缘检测算法.四、实验设备和仪器1.计算机2.matlab开发平台五、关键代码及注释I=imread('coins.png'); %读取原始图像subplot(2,2,1),imshow(I);title('原图');BW1=edge(I,'sobel'); %sobel边界探测器BW2=edge(I,'prewitt'); %prewitt边界探测器BW3=edge(I,'canny'); %canny边界探测器subplot(2,2,2),imshow(BW1);title('sobel边缘探测器');subplot(2,2,3),imshow(BW2);title('prewitt边缘探测器');subplot(2,2,4),imshow(BW3);title('canny边缘探测器');六、实验结果有实验结果可以看出,对此图用sobel和prewitt算子进行边缘检测效果最好,因为sobel和prewitt算子有一定的噪声抑制能力,在检测阶跃边缘时得到的边缘宽度至少为二像素。

matlab实验报告实验二

matlab实验报告实验二

matlab实验报告实验二Matlab实验报告实验二引言Matlab是一种功能强大的数学软件,广泛应用于科学研究和工程实践中。

在实验二中,我们将探索Matlab的图像处理功能,并通过实际案例来展示其应用。

图像处理基础图像处理是指对图像进行数字化处理的过程,其目的是改善图像质量、提取有用信息或实现特定的应用需求。

在Matlab中,我们可以利用各种函数和工具箱来实现图像处理的各种任务,如图像增强、滤波、分割和特征提取等。

实验步骤1. 图像读取与显示在Matlab中,我们可以使用imread函数读取图像文件,并使用imshow函数将图像显示在屏幕上。

例如,我们可以读取一张名为"lena.jpg"的图像,并显示出来:```matlabimg = imread('lena.jpg');imshow(img);```2. 图像灰度化图像灰度化是将彩色图像转换为灰度图像的过程。

在Matlab中,我们可以使用rgb2gray函数将彩色图像转换为灰度图像。

例如,我们可以将上一步读取的图像转换为灰度图像:```matlabgray_img = rgb2gray(img);imshow(gray_img);```3. 图像二值化图像二值化是将灰度图像转换为二值图像的过程,其中只包含黑色和白色两种颜色。

在Matlab中,我们可以使用imbinarize函数将灰度图像二值化。

例如,我们可以将上一步得到的灰度图像二值化:```matlabbinary_img = imbinarize(gray_img);imshow(binary_img);```4. 图像平滑图像平滑是指去除图像中的噪声或细节,使得图像更加平滑和清晰。

在Matlab 中,我们可以使用imfilter函数对图像进行平滑处理。

例如,我们可以对上一步得到的二值图像进行平滑处理:```matlabsmooth_img = imfilter(binary_img, fspecial('average'));imshow(smooth_img);```5. 图像边缘检测图像边缘检测是指提取图像中物体边缘的过程,常用于目标检测和图像分割。

基于matlab的图像边缘检测原理及应用

基于matlab的图像边缘检测原理及应用

目录一.前言----------------------------------------- 二.边缘检测的与提取-----------------------1.边缘检测的定义---------------------------2.图像边缘检测算法的研究内容---------3.边缘检测算子------------------------------3.1.Sobel算子-----------------------------3.2.Canny算子----------------------------4.基于Matlab的实验结果与分析--------- 三.图像边缘检测的应用---------------------一.前言在实际图像边缘检测问题中,图像的边缘作为图像的一种基本特征,经常被应用到较高层次的图像应用中去。

它在图像识别,图像分割,图像增强以及图像压缩等的领域中有较为广泛的应用,也是它们的基础。

图像边缘是图像最基本的特征之一,往往携带着一幅图像的大部分信息。

而边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置,这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。

而边缘检测算法则是图像边缘检测问题中经典技术难题之一,它的解决对于我们进行高层次的特征描述、识别和理解等有着重大的影响;又由于边缘检测在许多方面都有着非常重要的使用价值,所以人们一直在致力于研究和解决如何构造出具有良好性质及好的效果的边缘检测算子的问题。

该课程设计具体考察了两种最常用的边缘检测算子并运用MATLAB进行图像处理比较。

二.边缘检测于算子1.边缘检测的定义图像边缘是图像最基本的特征,边缘在图像分析中起着重要的用。

所谓边缘(edge)是指图像局部特征的不连续性。

灰度或结构信息的突变称为边缘,例如:灰度级的突变、颜色的突变、纹理结的突变。

MATLAB在图像边缘检测中的应用

MATLAB在图像边缘检测中的应用

增 强 ; 像 滤 波 ; 性 二 维 滤 波器 设 计 ; 像 变换 ; 域 和块 操 作 ; 图 线 图 领 二
() 丌 3c n y算 子 它 是 一 阶 算 子 其 方 法 的 实 质 是 用 一 个 准 高 斯 函 值 图 像 操 作 ; 色 映 射 和 颜 色 空 间 转 换 ; 像 类 型 和 类 型 转 换 ; 具 数 做 平 滑 运 算 然 后 以带 方 向 的一 阶 微 分算 子 定位 导 数 最大 值 。它可 颜 图 工 包 参 数 获 取 和 设 置 等 ” 其 他 工 具 包 一 样 , 户 还 可 以 根 据 需 要 书 写 用 高 斯 函 数 的 梯 度 来 近 似 在 理 论 上 很 接 近 k个 指 数 函 数 的 线 性 组 与 用
, 。
一/ ( 1 +) +v可 , 一 / _ XO +— 1] [ _ 、 —x , y x 可 r 丽

] , ]
其 中 fxy是 具 有 整 数 像 素 坐 标 的 输 入 图 像 , 方 根 运 算 使 该 处 (,) 平 函 数 组 成 的 , 支 持 的 图 像 处 理 操 作 有 : 何 操 作 、 域 操 作 和 块 操 理 类 似 于 在 人 类 视 觉 系 统 中 发 生 的 过 程 所 几 区 作 ; 性 滤波 和 滤 波器 设 计 ; 线 变 () i。 2Kr h算 子 它 有 八 个 卷 积 核 s

图 像 中 每 个 点 都 用 八 个 卷 积 核
图像 操 作 等 。 图 像处 理 工 具 包 的 函数 , 功 能 可 以分 为 以 下 几类 : 按 图 进 行 卷 积 每 个 卷 积 核 对 某 个 特 定 边 缘 方 向 作 出 最 大 响 应 , 有 八 个 所 像 显示 ; 图像 文件 输 入 与 输 出 ; 何 操 作 ; 素 值 统 计 ; 像 分 析 与 方 向 中 的最 大值 作 为 边缘 图像 的输 出。 几 像 图

实现用三种边缘检测算子对一幅图像提取边缘

实现用三种边缘检测算子对一幅图像提取边缘

实现用三种边缘检测算子对一幅图像提取边缘,给出结果并分析。

用sobel,log,candy三种算子对图像进行边缘提取:f = imread('E:\木子的U盘\大三的木子\第一学期\数字图像处理\xback.jpg');f = rgb2gray(f); %将图像转化为灰度图像[gsobel_default,ts] = edge(f,'sobel');%利用sobel算子的默认语法得到边缘图像subplot(231);imshow(gsobel_default);title('g sobel default');[glog_default,tlog]=edge(f,'log');%利用log算子的默认语法得到边缘图像subplot(233);imshow(glog_default);title('g log default');[gcanny_default,tc]=edge(f,'canny');%利用candy算子的默认语法得到边缘图像subplot(235);imshow(gcanny_default);title('g canny default');gSobel_best=edge(f,'sobel',0.05);%减少不必要的细节subplot(232);imshow(gSobel_best);title('g sobel best');gLog_best=edge(f,'log',0.003,2.25);%subplot(234);imshow(gLog_best);title('g log best');gCanny_best=edge(f,'canny',[0.04 0.10],1.5);%subplot(236);imshow(gCanny_best);title('g canny best');MATLAB图像显示如下:分析如下:sobel得出的结果与试图检测边缘的目标相差太远。

  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】。

相关文档
最新文档