设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1703|回复: 0

基于MATLAB的Sobel边缘检测算法实现

[复制链接]

38

主题

328

金钱

536

积分

初级用户

发表于 2019-7-9 16:36:52 | 显示全部楼层 |阅读模式

图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大。

Sobel算子主要用作边缘检测,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。

  边缘是指其周围像素灰度急剧变化的那些像素的集合。边缘存在于目标、背景和区域之间,所以,边缘是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。

  Sobel边缘检测的核心在于像素矩阵的卷积,卷积对于数字图像处理非常重要,很多图像处理算法都是做卷积来实现的。卷积运算的本质就是对指定的图像区域的像素值进行加权求和的过程,其计算过程为图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,将卷积的结果作求和运算,运算到的和就是卷积运算的结果。

矩阵的卷积公式如下。
1.png

3x3的窗口M与卷积模板C的卷积运算如下。
2.png
Gx和Gy是sobel的卷积因子,将这两个因子和原始图像做如下卷积。
3.png
Sobel卷积因子

其中A代表原始图像。
4.png
得到图像中的每一个点的横向纵向灰度值Gx、Gy。最后通过如下公式来计算改变灰度的大小。
5.png
但是通常为了提高效率,使用不开平方的近似值,虽然这样做会损失精度,
6.png

将Sobel算子的实现划分为五个步骤:
(1) 计算Gx与Gy与模板每行的乘积。
(2) 两个3x3矩阵的卷积即将每一行每一列对应相乘然后相加。
(3) 求得3*3模板运算后的Gx、Gy。
(4) 求Gx^2 + Gy^2的平方根或者直接对Gx和Gy取绝对值后求和。
(5)设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。

平方根和绝对值函数
sqrt(x) 计算平方根
abs(x)取数值的绝对值和复数的幅值

在对图像数据进行运算时最好将图像数据转化成double类型的,避免精度损失。

Sobel边缘检测MATLAB实现
Sobel Edge Detect
  1. %RGB_YCbCr
  2. clc;
  3. clear all;
  4. close all;

  5. RGB_data = imread('lena.jpg');%

  6. R_data =    RGB_data(:,:,1);
  7. G_data =    RGB_data(:,:,2);
  8. B_data =    RGB_data(:,:,3);

  9. %imshow(RGB_data);

  10. [ROW,COL, DIM] = size(RGB_data);

  11. Y_data = zeros(ROW,COL);
  12. Cb_data = zeros(ROW,COL);
  13. Cr_data = zeros(ROW,COL);
  14. Gray_data = RGB_data;

  15. for r = 1:ROW
  16.     for c = 1:COL
  17.         Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
  18.         Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
  19.         Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
  20.     end
  21. end

  22. Gray_data(:,:,1)=Y_data;
  23. Gray_data(:,:,2)=Y_data;
  24. Gray_data(:,:,3)=Y_data;

  25. figure;
  26. imshow(Gray_data);

  27. %Median Filter
  28. imgn = imnoise(Gray_data,'salt & pepper',0.02);

  29. figure;
  30. imshow(imgn);

  31. Median_Img = Gray_data;
  32. for r = 2:ROW-1
  33.     for c = 2:COL-1
  34.         median3x3 =[imgn(r-1,c-1)    imgn(r-1,c) imgn(r-1,c+1)
  35.                     imgn(r,c-1)      imgn(r,c)      imgn(r,c+1)
  36.                     imgn(r+1,c-1)      imgn(r+1,c) imgn(r+1,c+1)];
  37.         sort1 = sort(median3x3, 2, 'descend');
  38.         sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
  39.         sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
  40.         sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
  41.         mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
  42.         Median_Img(r,c) = mid_num(2);
  43.     end
  44. end

  45. figure;
  46. imshow(Median_Img);

  47. %Sobel_Edge_Detect

  48. Median_Img = double(Median_Img);
  49. Sobel_Threshold = 150;
  50. Sobel_Img = zeros(ROW,COL);
  51. for r = 2:ROW-1
  52.     for c = 2:COL-1
  53.         Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);
  54.         Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);
  55.         Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
  56.         %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);
  57.         if(Sobel_Num > Sobel_Threshold)
  58.             Sobel_Img(r,c)=0;
  59.         else
  60.             Sobel_Img(r,c)=255;
  61.         end
  62.     end
  63. end

  64. figure;
  65. imshow(Sobel_Img);
复制代码



处理后的图片效果
7.jpg
中值滤波后的lena

8.jpg
Sobel边沿检测后的lena

为了使图像边缘更加明朗,可以在Sobel的基础上再进行腐蚀膨胀处理,腐蚀膨胀处理.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表