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

摘要:
Sobel算子主要用作边缘检测,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。Sobel边缘检测的核心在于像素矩阵的卷积,卷积对于数字图像处理非常重要,很多图像处理算法都是做卷积来实现的。但是通常为了提高效率,使用不开平方的近似值,虽然这样做会损失精度,,将Sobel算子的实现划分为五个步骤:计算Gx与Gy与模板每行的乘积。

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

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

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

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

矩阵的卷积公式如下。

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

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

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

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

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

Sobel卷积因子

其中A代表原始图像。

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

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

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

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

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

将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);

处理后的图片效果

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

中值滤波后的lena

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

Sobel边沿检测后的lena

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

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

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

个人微信订阅号:开源FPGA

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

知乎ID:NingHeChuan

微博ID:NingHeChuan

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

免责声明:文章转载自《基于MATLAB的Sobel边缘检测算法实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sql 整数相除 怎么取得小数基于vs2012的opencv开发环境搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CSAR——Channel-wise and Spatial Feature Modulation Network for Single Image Super-Resolution

1. 摘要 CNN 中的特征包含着不同类型的信息,它们对图像重建的贡献也不一样。然而,现在的大多数 CNN 模型却缺少对不同信息的辨别能力,因此也就限制了模型的表示容量。 另一方面,随着网络的加深,来自前面层的长期信息很容易在后面的层被削弱甚至消失,这显然不利于图像的超分辨。 作者提出了一个通道和空间特征调制(CSFM)网络,其中一系列特征调制记忆(FMM...

轻松学Pytorch-详解Conv2D卷积处理

轻松学Pytorch-详解Conv2D卷积处理 原创 gloomyfish OpenCV学堂 4月25日 收录于话题 #轻松学Pytorch系列 30个 图片 点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 Conv2D基本原理与相关函数 常见的图像卷积是二维卷积,而深度学习中Conv2D卷积是三维卷积,图示...

Faster R-CNN论文详解

废话不多说,上车吧,少年 paper链接:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks &创新点 设计Region Proposal Networks【RPN】,利用CNN卷积操作后的特征图生成region proposals,代替了...

超详细介绍 图像处理(卷积)(转)

图像处理(卷积)作者太棒了    原文   http://blog.sina.com.cn/s/blog_4bdb170b01019atv.html 图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应) 这里讨论利用输入图像中像素的小邻域来产生输出图像的方法,在信号处理中这种方法称为滤波(filtering)。其中,最常用的是线性滤波:输出...

深度学习入门|第七章 卷积神经网络(二)

前言 本文学学习深度学习入门一书的学习笔记,详情请阅读原著 三、池化层 池化是缩小高、长方向上的空间的运算。比如,如图 7-14 所示,进行将 2 × 2 的区域集约成 1 个元素的处理,缩小空间大小。 图 7-14 Max 池化的处理顺序 图 7-14 的例子是按步幅 2 进行 2 × 2 的 Max 池化时的处理顺序。“Max 池化”是获取最大值的运...

Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版

【引言】最近接手了公司的关于虫子识别的项目,使用MXNet框架开发,但是实际用的是Deformable-ConvNets. Deformable-ConvNets为微软研究研究院提出的可变卷积网络,可用于对图像中大小不一的物体识别,不是单单识别图中的猫和狗(它们都一般大小),而识别图像中不同种类的虫子(虫子本身小,而且难以区分),在这样的场景下很适合用可变...