基于matlab的不同边缘检测算子的边缘检测

news2024/11/25 1:08:02

1 原理

1.1 边缘检测概述

边缘检测是图像处理和计算机视觉中的基本问题,其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化,如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中起着关键作用,因为它能够大幅度地减少数据量,并剔除不相关的信息,同时保留图像重要的结构属性。

1.2 Prewitt算子

Prewitt算子是一种一阶微分算子的边缘检测。它利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

公式表示:
对于数字图像f(x,y),Prewitt算子的定义如下:
G(i) = | [f(i-1,j-1) + f(i-1,j) + f(i-1,j+1)] - [f(i+1,j-1) + f(i+1,j) + f(i+1,j+1)] |
G(j) = | [f(i-1,j+1) + f(i,j+1) + f(i+1,j+1)] - [f(i-1,j-1) + f(i,j-1) + f(i+1,j-1)] |

1.3 Roberts算子

Roberts算子由Lawrence Roberts在1963年提出,基于离散微分的原理,通过计算图像上相邻像素点之间的差异来检测边缘。它使用两个2x2的模板进行卷积操作。

模板表示:
Gx = [[1, 0], [0, -1]]
Gy = [[0, 1], [-1, 0]]

1.4 Sobel算子

Sobel算子是一种一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。

公式表示:
Sx = (Z1 + 2Z2 + Z3) - (Z7 + 2Z8 + Z9)
Sy = (Z1 + 2Z4 + Z7) - (Z3 + 2Z6 + Z9)

1.5 LoG(Laplacian of Gaussian)算子

LoG算子结合了高斯平滑和拉普拉斯算子。首先使用高斯滤波器对图像进行平滑处理,然后利用拉普拉斯算子进行边缘检测。这样可以减少噪声对边缘检测的影响。

高斯平滑公式(见参考文章7的高斯滤波公式)
LoG算子公式(见参考文章6的LoG函数表达式)

1.6 Canny边缘检测算法

Canny边缘检测算法是一个多级检测算法,结合了高斯滤波、梯度的强度和方向、双阈值处理和边缘跟踪等技术。其目标是找到一个最优的边缘检测算法。

由于Canny边缘检测算法涉及多个步骤和复杂的计算,其完整的公式和算法流程较为复杂,无法在此处直接给出。但基本思想是利用高斯滤波平滑图像,计算梯度的强度和方向,然后通过双阈值处理和边缘跟踪来确定边缘。

以上即为边缘检测及其常见算子的简要介绍和原理公式。在实际应用中,可以根据具体需求和图像特性选择合适的边缘检测算法。

2 代码

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%% 图像预处理-高斯滤波与图像去噪 
I = imread('test.jpeg');  
if size(I, 3) == 3  
    % 如果是彩色图像,转换为灰度图像  
    I = rgb2gray(I);  
end  
I = im2double(I); % 将图像转换为双精度,范围在[0, 1]    
% 对图像进行高斯滤波  
h = fspecial('gaussian', [5 5], 1); % 创建一个5x5的高斯滤波器,标准差为1  
I_gaussian = imfilter(I, h);    
% 绘制原始图像和原始直方图  
figure;  
subplot(3, 2, 1),imshow(I);  
title('原始图像');   
subplot(3, 2, 2),imhist(I);  
title('原始直方图');  
%  绘制高斯滤波后的图像和对应的直方图  
subplot(3, 2, 3),imshow(I_gaussian);  
title('高斯滤波后的图像');  
subplot(3, 2, 4),imhist(I_gaussian);  
title('高斯滤波后的直方图');   
% 去噪使用中值滤波  
I_denoised = medfilt2(I); % 使用中值滤波进行去噪    
% 绘制去噪后的图像和对应的直方图  
subplot(3, 2, 5),imshow(I_denoised);  
title('去噪后的图像');  
subplot(3, 2, 6),imhist(I_denoised);  
title('去噪后的直方图');  
%% %% 边缘检测
% 读取图像  
I6 = imread('test.jpeg'); 
I6 = rgb2gray(I6); % 转换为灰度图像   
% 初始化figure和subplot  
figure;  
% 绘制原始图像作为对比  
subplot(3, 2, 1);  
imshow(I6);  
title('原始图像');    
% Prewitt边缘检测  
BW_prewitt = edge(I6, 'prewitt');  
subplot(3, 2, 2);  
imshow(BW_prewitt);  
title('Prewitt 边缘检测');    
% Roberts边缘检测  
BW_roberts = edge(I6, 'roberts');  
subplot(3, 2, 3);  
imshow(BW_roberts);  
title('Roberts 边缘检测');  
% Sobel边缘检测  
BW_sobel = edge(I6, 'sobel');  
subplot(3, 2, 4);  
imshow(BW_sobel);  
title('Sobel 边缘检测');   
% LoG边缘检测  
BW_log = edge(I6, 'log');  
subplot(3, 2, 5);  
imshow(BW_log);  
title('LoG 边缘检测');   
% Canny边缘检测(需要设置阈值)  
BW_canny = edge(I6, 'canny', [0.4, 0.7]); % 这里设置了高低两个阈值  
subplot(3, 2, 6);  
imshow(BW_canny);  
title('Canny 边缘检测');  
% 添加标签和标题  
set(gcf, 'Name', '边缘检测算子比较');
%% 图像预处理-灰度化与图像反白
I1 = imread('test.jpeg');  
figure;
subplot(2,2,1);%用subplot建立多个子图
imshow(I1);%用imshow显示图像I
title('原始彩色图像');  
J=rgb2gray(I1);%将彩色图像工转换为灰度图像J
subplot(2,2,2);imshow(J);% 用imshow显示图像J
title('灰度图像');  
subplot(2,2,3);imhist(J);% 计算和显示灰度图像J的灰度直方图
title('灰度直方图');  
Ave = mean2(J);%用mean2函数求图像J的均值
SD = std2(double(J));%用std2函数求图像J的均值
s= size(J);%图像大小为s(1)×s(2)
all_white = 255*ones(s(1),s(2));%设置全部为白色灰度255
all_white_uint8=uint8(all_white);%将double类型矩阵转化为uint8类型矩阵
K= imsubtract(all_white_uint8,J);%图像相减得反白图像K
subplot(2,2,4);imshow(K);%用imshow显示图像K
title('反白图像');  
  %% 线性变换进行图像增强
I2= imread('test.jpeg');
J2=rgb2gray(I2);
figure;
subplot(2,2,1), imshow(J2) ;
title('原始图像');  
subplot(2,2,2), imhist(J2) ;%显示原始图像的直方图
title('原始灰度直方图');  
K = imadjust(J2,[0.4 0.6],[]);%使用imadjust函数进行灰度的线性变换
subplot(2,2,3), imshow(K);
title('线性变换后的灰度图像');  
subplot(2,2,4),imhist(K)%显示变换后图像的直方图
title('线性变换后的灰度直方图');

%% 伽马变换进行图像增强
figure;
subplot(3,2,1), imshow(J2) ;
title('原始图像');  
subplot(3,2,2), imhist(J2) ;%显示原始图像的直方图
title('原始灰度直方图'); 
gamma = 0.5;
I_gamma = imadjust(J2, [], [], gamma);  
subplot(3,2,3),imshow(I_gamma); 
title('伽马变换后的灰度图像'); 
subplot(3,2,4),imhist(I_gamma);
title('伽马变换后的灰度直方图'); 
%% % 对数变换进行图像增强  
c = 0.5; % 控制参数,用于避免log(0)  
I_log = c * log(1 + double(J2)) / log(256);  
I_log = im2uint8(I_log);    
subplot(3,2,5);  
imshow(I_log);  
title('对数变换后的图像');
subplot(3,2,6);  
imhist(I_log);
title('对数变换后的灰度直方图');
%% 
figure('Position',[50 50 800 600])
subplot(4,2,1), imshow(J2);
title('原始图像');  
subplot(4,2,2), imhist(J2);
title('原始灰度直方图'); 
subplot(4,2,3), imshow(K);
title('线性变换后的灰度图像');  
subplot(4,2,4),imhist(K)%显示变换后图像的直方图
title('线性变换后的灰度直方图');
subplot(4,2,5),imshow(I_gamma); 
title('伽马变换后的灰度图像'); 
subplot(4,2,6),imhist(I_gamma);
title('伽马变换后的灰度直方图'); 
subplot(4,2,7),imshow(I_log);  
title('对数变换后的图像');
subplot(4,2,8),imhist(I_log);
title('对数变换后的灰度直方图');
%% 直方图均衡化进行图像增强
I3 = imread('test.jpeg'); % 读取图像  
I_gray = rgb2gray(I3); % 转换为灰度图像    
% 直方图均衡化  
I_eq = histeq(I_gray);    
% 显示原始图像和增强后的图像  
figure;
subplot(2, 2, 1),imshow(I_gray);
title('原始图像'); 
subplot(2, 2, 2);  
imhist(I_gray),title('原始灰度直方图'); 
subplot(2, 2, 3),imshow(I_eq);  
title('直方图均衡化后的图像');
subplot(2, 2, 4),imhist(I_eq);  
title('直方图均衡化后的灰度直方图');

3 运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1852768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

36.Http协议的设计与解析

Http协议比Redis协议复杂的多,如果程序员自己去实现,工作量大。 Netty已经把Http协议的编解码器实现好了,只需要简单的配置就可以使用。 做一个http的服务端需要HttpServerCodec。 看它继承的父类: 结合了两个类: HttpRequestDecoder(入站处理器extends Channelnbound…

微信小程序反编译 2024 unveilr.exe

ps:一开始用的反编译工具是wxappUnpacker,后面改为 unveilr.exe 1.先找到小程序安装目录“E:\聊天记录\WeChat Files\Applet”,要反编译小程序的包 文件夹下的名字对应的是小程序ID,如果不确定是哪个,可以删除->打…

使用SpringBootTest测试项目

当我们开发项目后,通常需要进行单元测试,确保开发符合预期。但是对于Springboot项目,依赖部分IOC容器对象的注入。比如代码中存在Autowired、Service、Mapper等。 1、确保pom.xml中包含了依赖,其中的version和scope,大…

流程控制相关

1.break语句 只能用在循环体内,用来结束当前循环 语法: while 循环条件表达式: 语句块 if 条件表达式: break 语句块 for i in 迭代对象: 语句块 if 条件表达式: break 语句块 小练: 求一…

52、U-boot2023的移植教程

uboot:https://ftp.denx.de/pub/u-boot/ nxp-uboot:https://github.com/nxp-imx/uboot-imx 1、顶层Makefile 文件加入编译的两种方式:以xxx/xxx.c文件为例 1、使用menuconfig: 先编辑.c所在目录下的Kconfig&#xff0…

element-plus form表单组件之el-date-picker日期选择器组件

el-date-picker日期选择器组件可根据年,月,日期,时间范围来进行选择,可以自定义日期格式,和样式,还提供多种内置事件。 主要属性如下 属性名说明类型可选值默认值model-value / v-model绑定值&#xff0c…

江协科技51单片机学习- p11 Proteus安装模拟51单片机

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: Proteus快速入门&…

想更好应对突发网络与业务问题?您需要一款“全流量”

全流量分析,能为我做什么? 在生活中遇到问题,我们的第一反应可能是拿出手机拍照记录,方便后续处理。这些问题是临时的、突发的。 流量分析,就是网络中的“手机”,针对突发的网络故障和安全事件&#xff0…

骑砍战团mod制作所需工具

骑砍战团mod制作所需工具 多去骑砍中文站,最底下mod制作专区那边就可以找到大部分资源 文章目录 骑砍战团mod制作所需工具编译环境骑砍源码模型工具模型素材位置骑砍mod学习位置 编译环境 python2.7下载 根据界面安装完成之后,然后配置系统环境&#x…

【Python机器学习】NMF——将NMF应用于人脸图像

将NMF应用于之前用过的Wild数据集中的Labeled Faces。NMF的主要参数是我们想要提取的分量个数。通常来说,这个数字要小于输入特征的个数(否则的话,将每个像素作为单独的分量就可以对数据进行解释)。 首先,观察分类个数…

pandas处理天气数据

题目分析 一、题目要求 使用Pandas读取数据;现有的“date”列没有包含星期信息,需要根据其额外生成一列“week”,表示星 期,例如“星期一”;将温度处理成整型,例如将5℃处理成5,注意&#xff…

DAY11-力扣刷题

1.最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 64. 最小路径和 - 力扣(LeetCode) class Solution {p…

链接脚本文件入门介绍

本文框架 1. Why<为什么需要链接文件>2.What<是什么及组成>2.1 MEMORY介绍2.2 SECTIONS介绍 3.How<链接文件应用>3.1 定义特定字段3.2 将变量定义在指定段3.3 将变量定义在不同的段3.4 将变量定义在指定地址3.5 将函数定义在指定段3.6 将函数定义在指定地址 …

在 iPhone 上恢复已删除联系人的 5 种简便方法

想象一下&#xff1a;您正在 iPhone 上滚动并搜索要拨打的联系人&#xff0c;但却找不到任何结果。然后您想起昨晚您试图删除一个名字相似的联系人&#xff0c;但不知何故删除了错误的联系人。或者您的孩子错误地删除了一些联系人。这些情况足以让您感到迷茫。但别担心&#xf…

TI毫米波雷达可以用串口调试助理来获取原始数据吗?

摘要&#xff1a;本文介绍一下如何使用普通的串口调试助理来读取到AWR1843毫米波雷达的数据的。 使用的硬件如下图所示。 软件就是普通的串口助理&#xff0c;我用的是SSCOM&#xff0c;其他串口助理也是可以的&#xff0c;核心作用其实就是发送一行行的指令而已。 操作方法&am…

如何识别商业电子邮件诈骗

复制此链接到微信打开阅读全部已发布文章 不要关闭它标签&#xff01;我知道很少有词组比商业、电子邮件和妥协更无趣。 但这不是一篇无聊的文章&#xff1a;这是一篇关于电子邮件骗子的文章&#xff0c;根据联邦调查局的说法&#xff0c;他们每年通过诈骗人们赚取 260 亿美元…

EtherCAT数据包抓取(wireshark)

目录 1、twincat配置 2、选择正确的网卡 3、过滤条件示例 (1) 过滤逻辑读的数据帧 (2) 过滤邮箱等配置数据 (3) 抓取读EtherCAT状态的数据帧 1、twincat配置 勾选 Device2->Adapter->Promiscuous Mode&#xff0c;重新激活配置。 2、选择正确的网卡 3、过滤条件示…

用含成员函数的类,分别输入和输出各对象中的时间(时:分:秒)

编写程序&#xff1a; 运行结果&#xff1a; 注意&#xff1a; &#xff08;1&#xff09;在主函数中调用两个成员函数时&#xff0c;应指明对象名(t1,t2)。表示调用的是哪一个对象的成员函数。t1.display()和t2.display()虽然都是调用同一个 display函数&#xff0c;但…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

【C++】————类和对象(中)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月22日 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#x…