zoukankan      html  css  js  c++  java
  • 基于MATLAB的Sobel边缘检测算法实现

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

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

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

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

    矩阵的卷积公式如下。

    3x3的窗口M与卷积模板C的卷积运算如下。

     

    Gx和Gy是sobel的卷积因子,将这两个因子和原始图像做如下卷积。

     

    Sobel卷积因子

    其中A代表原始图像。

     

    得到图像中的每一个点的横向纵向灰度值Gx、Gy。最后通过如下公式来计算改变灰度的大小。

     

    但是通常为了提高效率,使用不开平方的近似值,虽然这样做会损失精度,,

     

    将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 
     6 RGB_data = imread('lena.jpg');%
     7 
     8 R_data =    RGB_data(:,:,1);
     9 G_data =    RGB_data(:,:,2);
    10 B_data =    RGB_data(:,:,3);
    11 
    12 %imshow(RGB_data);
    13 
    14 [ROW,COL, DIM] = size(RGB_data); 
    15 
    16 Y_data = zeros(ROW,COL);
    17 Cb_data = zeros(ROW,COL);
    18 Cr_data = zeros(ROW,COL);
    19 Gray_data = RGB_data;
    20 
    21 for r = 1:ROW 
    22     for c = 1:COL
    23         Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
    24         Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
    25         Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
    26     end
    27 end 
    28 
    29 Gray_data(:,:,1)=Y_data;
    30 Gray_data(:,:,2)=Y_data;
    31 Gray_data(:,:,3)=Y_data;
    32 
    33 figure;
    34 imshow(Gray_data);
    35 
    36 %Median Filter
    37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
    38 
    39 figure;
    40 imshow(imgn);
    41 
    42 Median_Img = Gray_data;
    43 for r = 2:ROW-1
    44     for c = 2:COL-1
    45         median3x3 =[imgn(r-1,c-1)    imgn(r-1,c) imgn(r-1,c+1)
    46                     imgn(r,c-1)      imgn(r,c)      imgn(r,c+1)
    47                     imgn(r+1,c-1)      imgn(r+1,c) imgn(r+1,c+1)];
    48         sort1 = sort(median3x3, 2, 'descend');
    49         sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
    50         sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
    51         sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
    52         mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
    53         Median_Img(r,c) = mid_num(2);
    54     end
    55 end
    56 
    57 figure;
    58 imshow(Median_Img);
    59 
    60 %Sobel_Edge_Detect
    61 
    62 Median_Img = double(Median_Img);
    63 Sobel_Threshold = 150;
    64 Sobel_Img = zeros(ROW,COL);
    65 for r = 2:ROW-1
    66     for c = 2:COL-1
    67         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);
    68         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);
    69         Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
    70         %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);
    71         if(Sobel_Num > Sobel_Threshold)
    72             Sobel_Img(r,c)=0;
    73         else
    74             Sobel_Img(r,c)=255;
    75         end
    76     end
    77 end
    78 
    79 figure;
    80 imshow(Sobel_Img);

    处理后的图片效果

    中值滤波后的lena

    Sobel边沿检测后的lena

        为了使图像边缘更加明朗,可以在Sobel的基础上再进行腐蚀膨胀处理,腐蚀膨胀处理,下一篇继续分享。

    转载请注明出处:NingHeChuan(宁河川)

    个人微信订阅号:开源FPGA

    如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

    知乎ID:NingHeChuan

    微博ID:NingHeChuan

    原文地址:https://www.cnblogs.com/ninghechuan/p/9529936.html 

  • 相关阅读:
    校园网认证原理
    使VS Code自带的Markdown支持mathjax
    图像处理实用资源
    第一周的python作业
    Python中关于turtle库的笔记
    软件测试入门篇
    如何设计一条好的测试用例打卡第二天
    根据用户登录浅谈软件测试打卡第一天
    Andorid源码系列:View的onTouchEvent()与performClick(),performLongClick()调用时机解析
    论Activity及启动模式,Fragment,Service的使用以及生命周期
  • 原文地址:https://www.cnblogs.com/ninghechuan/p/9529936.html
Copyright © 2011-2022 走看看