热门标签 | 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


推荐阅读
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • JavaScript实现表格数据的实时筛选功能
    本文介绍如何使用JavaScript实现对表格数据的实时筛选,帮助开发者提高用户体验。通过简单的代码示例,展示如何根据用户输入的关键字动态过滤表格内容。 ... [详细]
  • 卷积神经网络(CNN)基础理论与架构解析
    本文介绍了卷积神经网络(CNN)的基本概念、常见结构及其各层的功能。重点讨论了LeNet-5、AlexNet、ZFNet、VGGNet和ResNet等经典模型,并详细解释了输入层、卷积层、激活层、池化层和全连接层的工作原理及优化方法。 ... [详细]
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社区 版权所有