基于MATLAB边缘检测算子的实现

作者:lee神

  1. 1.   概述

边缘检测是图像处理计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。

一阶:  Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,罗盘算子;

二阶: Marr-Hildreth,在梯度方向的二阶导数过零点,Canny算子,Laplacian算子。

  1. 2.   经典边缘检测算子的简介

Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

Prewitt算子是一种一阶微分算子边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

对数字图像f(x,y),Prewitt算子的定义如下:

G(i)={[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]}

G(j)={[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]}

则 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)

Sobel算法是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。

函数的拉普拉斯算子也是该函数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。如果邻域系统是4 邻域,Laplacian 算子的模板为:

0

1

0

1

-4

1

0

1

0

4邻域Laplacian 算子

如果邻域系统是8 邻域,Laplacian 算子的模板为:

1

1

1

1

-8

1

1

1

1

8 邻域Laplacian 算子

前面提过,Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

  1. 3.   MATLAB实现方法一

实验原图:

使用Matlab内部函数edge实现边缘检测算法:

I=imread('lena.jpg');%提取图像

img=rgb2gray(I);

[m,n]=size(img);

BW1=edge(img,'sobel'); %用Sobel算子进行边缘检测

BW2=edge(img,'roberts');%用Roberts算子进行边缘检测

BW3=edge(img,'prewitt'); %用Prewitt算子进行边缘检测

BW4=edge(img,'log'); %用Log算子进行边缘检测

BW5=edge(img,'canny'); %用Canny算子进行边缘检测

h=fspecial('gaussian',5);%¸高斯滤波

BW6=edge(img,'canny');%高斯滤波后使用Canny算子进行边缘检测

subplot(2,3,1), imshow(BW1);

title('sobel edge check');

subplot(2,3,2), imshow(BW2);

title('roberts edge check');

subplot(2,3,3), imshow(BW3);

title('prewitt edge check');

subplot(2,3,4), imshow(BW4);

title('log edge check');

subplot(2,3,5), imshow(BW5);

title('canny edge check');

subplot(2,3,6), imshow(BW6);

title('gasussian&canny edge check');

实现结果:

  1. 4.   方法二

实验原图

1)Laplacian 算子的实现:

clear;

sourcePic=imread('lena.jpg');%图像读入

grayPic=mat2gray(sourcePic);%实现图像的矩阵归一化操作

[m,n]=size(grayPic);

newGrayPic=grayPic;

LaplacianNum=0;%经Laplacian操作得到的每个像素的值

LaplacianThreshold=0.2;%设定阈值

for j=2:m-1 %进行边界提取

for k=2:n-1

LaplacianNum=abs(4*grayPic(j,k)-grayPic(j-1,k)-grayPic(j+1,k)-grayPic(j,k+1)-grayPic(j,k-1));

if(LaplacianNum > LaplacianThreshold)

newGrayPic(j,k)=255;

else

newGrayPic(j,k)=0;

end

end

end

figure,imshow(newGrayPic);

title('Laplacian算子的处理结果')

实现结果:

2)Prewitt 算子的实现:

clear;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

PrewittNum=0;

PrewittThreshold=0.5;%设定阈值

for j=2:m-1 %进行边界提取

for k=2:n-1

PrewittNum=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)+grayPic(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;

else

newGrayPic(j,k)=0;

end

end

end

figure,imshow(newGrayPic);

title('Prewitt算子的处理结果')

实现结果:

3)Sobel 算子的实现:

clear;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

sobelNum=0;

sobelThreshold=0.7;

for j=2:m-1

for k=2:n-1

sobelNum=abs(grayPic(j-1,k+1)+2*grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-2*grayPic(j,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k-1)+2*grayPic(j-1,k)+grayPic(j-1,k+1)-grayPic(j+1,k-1)-2*grayPic(j+1,k)-grayPic(j+1,k+1));

if(sobelNum > sobelThreshold)

newGrayPic(j,k)=255;

else

newGrayPic(j,k)=0;

end

end

end

figure,imshow(newGrayPic);

title('Sobel算子的处理结果')

实现结果:

5)Roberts 算子的实现:

clear all;

clc;

sourcePic=imread('lena.jpg');

grayPic=mat2gray(sourcePic);

[m,n]=size(grayPic);

newGrayPic=grayPic;

robertsNum=0;

robertThreshold=0.2;

for j=1:m-1

for k=1:n-1

robertsNum = 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;

else

newGrayPic(j,k)=0;

end

end

end

figure,imshow(newGrayPic);

title('roberts算子的处理结果')

实现结果:

  1. 5.   引用文档

1-------------------------------------------------------------------百度百科

欢迎大家关注我的微信公众号FPGA开源工作室以及QQ群。

基于MATLAB边缘检测算子的实现的更多相关文章

  1. 边缘检测算子和小波变换提取图像边缘【matlab】

    Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检 ...

  2. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  3. 基于MATLAB的手写公式识别(2)

    基于MATLAB的手写公式识别 图像的预处理(除去噪声.得到后续定位分割所需的信息.) 预处理其本质就是去除不需要的噪声信息,得到后续定位分割所需要的图像信息.图像信息在采集的过程中由于天气环境的影响 ...

  4. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  5. 图像边缘检测——几种图像边缘检测算子的学习及python 实现

    本文学习利用python学习边缘检测的滤波器,首先读入的图片代码如下: import cv2 from pylab import * saber = cv2.imread("construc ...

  6. 基于MATLAB的腐蚀膨胀算法实现

    本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作. 什么是二值图像 ...

  7. 基于matlab的边缘提取方法的比较

    1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...

  8. 基于MATLAB的离散小波变换

    申明,本文非笔者原创,原文转载自:  基于Matlab的离散小波变换         http://blog.sina.com.cn/s/blog_725866260100ryh3.html 简介 在 ...

  9. 各种边缘检测算子特点比较(canny)

    canny 最好.但是容易把噪点误判为边界.sobel prewitt log 效果差不多.prewitt比sobel 去噪效果好.roberts马马虎虎.适合什么图片那得看图片的噪点情况,一般can ...

随机推荐

  1. SQL server中事务的四个属性特征(ACID)

    事务的概念.类型和四个特征(ACID). 1.事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Se ...

  2. WPF 完美截图 <一>

    最近比较懒,一直没继续,此处省略一万字,下面开始正题. 简单介绍下截图的思路: 核心是利用 public CroppedBitmap(BitmapSource source, Int32Rect so ...

  3. [转载] Kafka+Storm+HDFS整合实践

    转载自http://www.tuicool.com/articles/NzyqAn 在基于Hadoop平台的很多应用场景中,我们需要对数据进行离线和实时分析,离线分析可以很容易地借助于Hive来实现统 ...

  4. C语言一些知识点回顾

    1.多行宏定义 #include <stdio.h> #define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _ ...

  5. Android Testing Point

    The test application demonstrates these key points: An Android test is itself an Android application ...

  6. c语言捕捉异常

    闲暇之日阅读lua源码,发现原来C语言除goto之外的另一个处理异常的方法.既为setjump longjump两个函数,setjump相当于try,longjump相当于catch.与goto不同的 ...

  7. Bin、App_Data等文件夹详述(转自http://blog.csdn.net/zzjiadw/article/details/6801506)

    ASP.NET应用程序和ASP.Net网站所共有的文件: App_Browsers 包含 ASP.NET 用于标识个别浏览器并确定其功能的浏览器定义 (.browser) 文件.有关更多信息,请参见浏 ...

  8. vue.js的学习中的简单案例

    今天学习了近年来挺火的一门JS技术,叫vue.js下面是它的一个简单案例: <html> <head> <title>$Title$</title> / ...

  9. 多线程编程 - PHP 实现

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  10. listview优化加强版

    import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory; ...