数字图像处理:边缘检测(Edge detection)

数字图像处理:边缘检测(Edge detection)

测试编译器为MATLAB

作为入门计算机视觉领域来说,Matlab是款非常使用的初学工具,其中的边缘检测、图像分割、霍夫变换等经典技术依然活跃在计算机视觉很多领域。因此,学好数字图像处理是我们入门计算机领域一个非常好的途径,好了话不多说,来和笔者一起看一下今天的主题-边缘检测。

一.What is Digital Image Processing?(什么是数字图像处理)

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nFDqDX2-1571991599194)(C:\Users\Song\AppData\Roaming\Typora\typora-user-images\1571491660107.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h85nJy1j-1571991599195)(C:\Users\Song\AppData\Roaming\Typora\typora-user-images\1571491887965.png)]

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

在这里插入图片描述

MATLAB实现方法一

数字图像处理:边缘检测(Edge detection)_第1张图片

%使用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');

实现结果:
数字图像处理:边缘检测(Edge detection)_第2张图片

方法二

% 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算子的处理结果')

实现结果:
数字图像处理:边缘检测(Edge detection)_第3张图片

% 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算子的处理结果')

实现结果:

数字图像处理:边缘检测(Edge detection)_第4张图片

%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算子的处理结果')

实现结果:

数字图像处理:边缘检测(Edge detection)_第5张图片

% 4)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算子的处理结果')

实现结果:

(robertsNum > robertThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
figure,imshow(newGrayPic);
title(‘roberts算子的处理结果’)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025162613839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM0NDcxMA==,size_16,color_FFFFFF,t_70)

你可能感兴趣的:(数字图像处理:边缘检测(Edge detection))