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


推荐阅读
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 大家好,全新的技术专栏《从零开始掌握容器云网络实战》正式上线。该专栏将系统地介绍容器云网络的基础知识、核心技术和实际应用案例,帮助读者全面理解和掌握容器云网络的关键技术与实践方法。 ... [详细]
  • 专业人士如何做自媒体 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Java swing 连连看小游戏  开发小系统 项目源代码 实训实验毕设
    Javaswing连连看小游戏开发小系统项目源代码实训实验能满足学习和二次开发可以作为初学者熟悉Java的学习,作为老师阶段性学习的一个成功检验不再是单调的理解老师空泛的知识,导入 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 【Linux进阶指南】第一阶段第三课:体验与部署Ubuntu系统
    在正式踏上Linux学习之旅之前,本课程将引导你深入体验和部署Ubuntu系统。通过详细的操作步骤和实践演练,你将掌握Ubuntu的基本安装、配置及常用命令,为后续的进阶学习打下坚实的基础。此外,课程还将介绍如何解决常见问题和优化系统性能,帮助你更加高效地使用Ubuntu。 ... [详细]
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社区 版权所有