小白学习图像处理5——图像锐化和边缘检测(matlab实现)

文章目录

  • 一、图像锐化的原理
      • 1、梯度法
      • 2、高通滤波
  • 二、使用edge函数实现边缘检测
      • 1、图像的线段检测
      • 2、edge函数
      • 3、roberts算子
      • 4、prewitt算子
      • 4、sobel算子
      • 5、canny算子
      • 6、图像二值化

一、图像锐化的原理

  图像锐化的目的是凸显物体的细节轮廓,通常可以用梯度、Laplace算子和高通滤波来实现,下面一一说明:

1、梯度法

梯度计算可以参考 小白学习图像处理——canny边缘检测算法 ,假设Gx为x方向的方向导数,Gy为y方向的方向导数,那么梯度就是Gx和Gy的平方和开根号:
G = [ G x 2 + G y 2 ] 2 G = [Gx^2 + Gy^2]^2 G=[Gx2+Gy2]2
其中,计算Gx和Gy的过程就是用一个预先定义的矩阵和图像做一次二维卷积,我们把这个预先定义的矩阵成为模板算子,计算Gx和Gy的算子有很多种,比如下面的Ty可以计算的梯度:
T y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] Ty = \begin{bmatrix} -1 & -2 & -1 \\ 0& 0 & 0\\ 1 & 2 & 1 \end{bmatrix} Ty=101202101
在matlab中,可以这样子计算梯度G,我们将imshow将G绘制一下就得到了锐化的图像(如果图像比较暗,可以进行阈值处理):

gx = [1 2 1; 0 0 0; -1 -2 -1];
gy = [1 0 -1; 2 0 -2; 1 0 -1];
Gx = conv2(I, gx, 'same');
Gy = conv2(I, gy, 'same');
G = sqrt(Gx.^2 + Gy.^2);
figure, imshow(G)

2、高通滤波

  高通滤波就是把图像的部分低频分量滤除,剩下的高频分量就是我们想要的细节,由于比较菜,这部分内容后面补上 (っ °Д °;)っ


二、使用edge函数实现边缘检测

  在matlab中预置了一些算子,如:robertssobelprewittlogcanny 算子等

1、图像的线段检测

  首先谈谈图像线段的检测,线段检测的原理类似梯度,线段通常具有这样的特点,线段上的灰度与左右两侧的灰度相比更加突出,因为它的灰度要么比两边都大,要么比两边都小,我们可以将像素点的灰度同时和两边灰度进行对比,判断它是否属于某一条边。
下面的算子分别可以检测水平方向、竖直方向和正45°方向上的边小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第1张图片
举个栗子
分别检测四个方向上的线条,并合成一张新的图像,为了使图像清晰,这里进行了阈值处理

I = imread('chiken.jpg');
I1 = im2double(rgb2gray(I));
h1 = [-1 -1 -1; 2 2 2; -1 -1 -1];
h2 = [-1 2 -1; -1 2 -1; -1 2 -1];
h3 = [2 -1 -1; -1 2 -1; -1 -1 2];
h4 = [-1 -1 2; -1 2 -1; 2 -1 -1];
J1 = imfilter(I1, h1);
J2 = imfilter(I1, h2);
J3 = imfilter(I1, h3);
J4 = imfilter(I1, h4);
J = J1 + J2 + J3 + J4;
T = graythresh(J);
[K] = im2bw(J, T);
figure
subplot(121), imshow(I)
subplot(122), imshow(K)

结果如下:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第2张图片

2、edge函数

matab中edge函数可以用来检测图像的边缘,用法如下:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第3张图片
参数介绍如下:

method — Edge detection method
=>	'Sobel' (default) | 'Prewitt' | 'Roberts' | 'log' | 'zerocross' | 'Canny' | 'approxcanny'
threshold — Sensitivity threshold
=>	numeric scalar | 2-element vector | []
direction — Direction of edges to detect
=>	'both' (default) | 'horizontal' | 'vertical'

:如果不指明算子类型 J = edge(I) 默认使用sobel算子


3、roberts算子

roberts算子采用差分来逼近梯度

I = imread('rice.tif');
I1 = im2double(rgb2gray(I));
[J, thresh] = edge(I1, 'roberts');
figure, imshowpair(I, J, 'montage')

效果补上很好,可以看到大米的边缘补上很连续
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第4张图片

4、prewitt算子

prewitt算子分别计算了水平方向和竖直方向的梯度:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第5张图片
举个栗子:

I = imread('cameraman.tif');
I1 = im2double(I);
[J, thresh] = edge(I1, 'prewitt', 'both');  % 水平和垂直方向
figure, imshowpair(I, J, 'montage')

结果不错:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第6张图片


4、sobel算子

下面我们使用sobel算子来检测水平方向的边缘

I = imread('hamberger.jpg');
I1 = im2double(rgb2gray(I));
[J, thresh] = edge(I1, 'sobel', [], 'horizontal');  % 水平方向
figure, imshowpair(I, J, 'montage')

从下图中可以看到,汉堡的水平边缘被检测出来,而垂直方向出现了断点
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第7张图片

5、canny算子

canny算子具有低误码率、高定位精度和一直虚假边缘等优点
使用方法如下:

thresh = [T1, T2];
BW = edge(I, 'canny', thresh)

canny算子在提取边缘后,以T1和T2作为阈值进行双阈值检测,函数返回值为二值图像BW
举个例子:

I = imread('rice.tif');
I = im2double(rgb2gray(I));
J = imnoise(I, 'gaussian', 0, 0.01);
[K, thresh] = edge(J, 'canny');
figure, imshowpair(J, K, 'montage')

我们先对图像加一个高斯噪声(检测抗噪性能),接着检测边缘,为设置阈值时,canny算法自己计算阈值,得到的图像很清晰:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第8张图片


6、图像二值化

图像二值化在边缘检测中关键,它可以让图像对比度更加明显

I = imread('rice.tif');
I = im2double(rgb2gray(I));
T = graythresh(I);
J = im2bw(I, T);    % OTSU算法获取阈值
figure, imshowpair(I, J, 'montage')

这里的阈值是通过OTSU算法计算得到的,即调用 graythresh 函数,结果如下:
小白学习图像处理5——图像锐化和边缘检测(matlab实现)_第9张图片


以上就是使用matlab函数实现边缘检测的全部内容啦
边缘检测的原理可以参考:小白学习图像处理——canny边缘检测算法
完结 cheers!

你可能感兴趣的:(数字图像处理,matlab)