热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATLAB实现Sobel边缘检测算法

图像边缘是指图像中灰度值发生显著变化的区域。Sobel算子是一种常用的边缘检测方法,通过计算图像灰度值的梯度来检测边缘。本文介绍了Sobel算子的基本原理,并提供了基于MATLAB的实现代码。

图像边缘是指图像中灰度值发生显著变化的区域。这些区域通常表示目标、背景或不同区域之间的边界。Sobel算子是一种常用的边缘检测方法,通过计算图像灰度值的梯度来检测边缘。

Sobel算子是一种离散型差分算子,用于计算图像亮度函数的灰度近似值。边缘检测的核心在于像素矩阵的卷积操作。卷积操作在数字图像处理中非常重要,许多图像处理算法都通过卷积来实现。卷积运算的本质是对指定图像区域的像素值进行加权求和的过程。

具体来说,卷积运算的计算过程如下:图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,然后将结果求和,得到的和即为卷积运算的结果。Sobel算子的卷积因子包括横向和纵向的卷积核,分别记为Gx和Gy。将这两个因子与原始图像进行卷积运算,得到每个像素点的横向和纵向灰度值Gx和Gy。最后,通过以下公式计算每个像素点的梯度大小:

为了提高效率,通常使用不开平方的近似值,尽管这样会损失一定的精度。具体的实现步骤如下:

  1. 计算Gx和Gy与模板每行的乘积。
  2. 对两个3x3矩阵进行卷积运算,即将每一行每一列对应相乘然后相加。
  3. 求得3x3模板运算后的Gx和Gy。
  4. 求Gx² + Gy²的平方根或者直接对Gx和Gy取绝对值后求和。
  5. 设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。

平方根和绝对值函数

在MATLAB中,sqrt(x) 用于计算平方根,abs(x) 用于取数值的绝对值和复数的幅值。在对图像数据进行运算时,最好将图像数据转换为double类型,以避免精度损失。

Sobel边缘检测MATLAB实现

以下是基于MATLAB的Sobel边缘检测算法实现代码:

% RGB to YCbCr conversion
clc;
clear all;
close all;

RGB_data = imread('lena.jpg');

R_data = RGB_data(:,:,1);
G_data = RGB_data(:,:,2);
B_data = RGB_data(:,:,3);

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

Y_data = zeros(ROW, COL);
Cb_data = zeros(ROW, COL);
Cr_data = zeros(ROW, COL);
Gray_data = RGB_data;

for r = 1:ROW
    for c = 1:COL
        Y_data(r, c) = 0.299 * R_data(r, c) + 0.587 * G_data(r, c) + 0.114 * B_data(r, c);
        Cb_data(r, c) = -0.172 * R_data(r, c) - 0.339 * G_data(r, c) + 0.511 * B_data(r, c) + 128;
        Cr_data(r, c) = 0.511 * R_data(r, c) - 0.428 * G_data(r, c) - 0.083 * B_data(r, c) + 128;
    end
end

Gray_data(:,:,1) = Y_data;
Gray_data(:,:,2) = Y_data;
Gray_data(:,:,3) = Y_data;

figure;
imshow(Gray_data);

% Add salt and pepper noise
imgn = imnoise(Gray_data, 'salt & pepper', 0.02);

figure;
imshow(imgn);

% Median filter
Median_Img = Gray_data;
for r = 2:ROW-1
    for c = 2:COL-1
        median3x3 = [imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1);
                     imgn(r,c-1) imgn(r,c) imgn(r,c+1);
                     imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)];
        mid_num = median(median3x3(:));
        Median_Img(r,c) = mid_num;
    end
end

figure;
imshow(Median_Img);

% Sobel edge detection
Median_Img = double(Median_Img);
Sobel_Threshold = 150;
Sobel_Img = zeros(ROW, COL);
for r = 2:ROW-1
    for c = 2:COL-1
        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);
        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);
        Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
        if (Sobel_Num > Sobel_Threshold)
            Sobel_Img(r,c) = 0;
        else
            Sobel_Img(r,c) = 255;
        end
    end
end

figure;
imshow(Sobel_Img);

处理后的图片效果

中值滤波后的lena

Sobel边沿检测后的lena

为了使图像边缘更加清晰,可以在Sobel基础上进行腐蚀和膨胀处理。腐蚀和膨胀处理将在后续文章中详细讨论。

转载自NingHeChuan(宁河川)
个人微信订阅号:开源FPGA
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址:https://www.cnblogs.com/ninghechuan/p/9529936.html


推荐阅读
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 给定行数 numRows,生成帕斯卡三角形的前 numRows 行。例如,当 numRows 为 5 时,返回的结果应为:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]。 ... [详细]
  • 在跨浏览器开发中,一个常见的问题是关于如何在鼠标悬停时显示图片提示信息。本文深入探讨了 IE 浏览器对 IMG 元素 alt 属性的特殊处理,并提供了最佳实践建议。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 自 Node.js 6.3 版本起,调试功能已内置在核心模块中,无需额外安装 node-inspector 等工具。通过简单的命令即可启动调试模式,并利用 Chrome 浏览器进行高效的代码调试。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
author-avatar
寒空动烟雪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有