基于matlab的不同边缘检测算子的边缘检测
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 运行结果

相关文章:
基于matlab的不同边缘检测算子的边缘检测
1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题,其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化,如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…...
CentOS安装ntp时间同步服务
CentOS安装ntp时间同步服务 安装ntp 检查服务器是否安装ntp: rpm -q ntp安装ntp: yum install -y ntp服务端配置 配置文件路径:/etc/ntp.conf 设置ntp为开机启动 systemctl enable ntpd查看ntp开机启动状态 enabled:开启, disabled:关闭 …...
【Linux进阶】UNIX体系结构分解——操作系统,内核,shell
1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。 从广义上…...
PageOffice国产版在线编辑word文件
PageOffice国产版支持统信UOS、银河麒麟等国产操作系统。调用客户端WPS在线编辑word、excel、ppt等文件。在线编辑效果与本地WPS一致。如图所示: web系统集成pageofficeV6.0国产版的文档:PageOfficeV6.0国产版最简集成代码(Springboot) PageOffice最简集…...
Bitmap位图数据排列方式
读取dicom C# 使用fo-dicom操作dicom文件-CSDN博客 创建位图 通过读取dicom得到像素内存,本例单指彩色图像。 Bitmap dataBmp new Bitmap(imageWidth, imageHeight, stride, PixelFormat.Format24bppRgb, dstBmp); 当像素的内存按照RGB的排列模式时,…...
重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等
目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 (添加、旋转、删除) 插入和调整各种对象,例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…...
16进制数按位修改
16进制数需要按位修改,特别是在修改寄存器的时候 16进制数转换为2进制 #16进制数转换为2进制 def hex_to_binary(hex_value):return bin((hex_value))二进制数转换为列表 def bin_to_array(bin_str):integer = int(bin_str, 2)array...
深度神经网络——什么是小样本学习?
引言 小样本学习是指使用极少量的训练数据来开发人工智能模型的各种算法和技术。小样本学习致力于让人工智能模型在接触相对较少的训练实例后识别和分类新数据。小样本训练与训练机器学习模型的传统方法形成鲜明对比,传统方法通常使用大量训练数据。小样本学习是 主…...
送物机器人电子方案定制
这是一款集娱乐、教育和互动于一身的高科技产品。 一、它的主要功能包括: 1. 智能对话:机器人可以进行简单的对话,回答用户的问题,提供有趣的互动体验。 2. 前进、后退、左转、右转、滑行:机器人可以通过遥控器或AP…...
chatgpt: linux 下用纯c 编写一按钮,当按钮按下在一新窗口显示本机主目录下图片子目录中的1.jpg图片
tmd,这chatgpt太强大了。 从下面的c程序与python程序对比,纯c的ui编程也不是太复杂。 再说一次,要想学好编程必须要用上这个chatgpt工具。 在 Linux 环境下使用纯 C 语言编写一个按钮,当按钮按下时,在一个新窗口中显示本机主目…...
SherlockChain:基于高级AI实现的智能合约安全分析框架
关于SherlockChain SherlockChain是一款功能强大的智能合约安全分析框架,该工具整合了Slither工具(一款针对智能合约的安全工具)的功能,并引入了高级人工智能模型,旨在辅助广大研究人员针对Solidity、Vyper和Plutus智…...
MySQL中Explain执行计划各参数的含义
EXPLAIN 语句输出的各个列的作用先大致罗列一下: 列名 描述 id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id select_type SELECT关键字对应的那个查询的类型 table 表名 partitions 匹配的分区信息 type 针对单表的访问方法 possible_keys…...
Redis队列自研组件
背景 年初的时候设计实践过一个课题:SpringBootRedis实现不重复消费的队列,并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后,我兴致勃勃的把它运用到了项目里面,可谁曾想,运行不久后…...
ArchLinux挑战安装(ZFS、Wayland、KDE、xero)
目录 0. 前言: 1. 先期准备 1.1 引导ArchLinx光盘。 1.2 禁用 reflector 服务 1.3 防止网卡禁用 1.4 wifi设置 1.5 测试网络是否连接 1.6 更新系统时间 1.7 更换源 1.8 下载ZFS模块 1.9 加载ZFS模块 2. 磁盘处理 2.1 查看磁盘分区 2.2 清除与整个磁盘…...
纯css写一个动态圣诞老人
效果预览 在这篇文章中,我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力,我们可以让圣诞老人在网页上摇摆,仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…...
百度Apollo的PublicRoadPlanner一些移植Ros2-foxy的思路(持续更新)
如今的PublicRoadPlanner就是之前耳熟能详的EM planner 计划 —— ROS2与CARLA联合仿真 结构化场景: 规划算法:EM-planner 控制算法:MPC和PID 非结构化场景: 规划算法采用Hybrid A* (1)小车模型搭建(计划参考Github上Hybrid上的黑车,比较炫酷) (2)车辆里程计: 位…...
Linux内存管理(七十三):cgroup v2 简介
版本基于: Linux-6.6 约定: 芯片架构:ARM64内存架构:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :31. cgroup 简介 术语: cgroup:control group 的缩写,永不大写(never capitalized); 单数形式的 cgroup 用于指定整个特性,也用…...
c++习题01-ljc的暑期兼职
目录 一,题目描述 二,思路 三,伪代码 四,流程图 五,代码 一,题目描述 二,思路 1,根据题目要求需要声明4个变量:a,b,c,d ;牛奶价格a,活动要求b&…...
有哪些方法可以恢复ios15不小心删除的照片?
ios15怎么恢复删除的照片?在手机相册里意外删除了重要的照片?别担心!本文将为你介绍如何在iOS 15系统中恢复已删除的照片。无需专业知识,只需要按照以下步骤操作,你就能轻松找回宝贵的回忆。 一、从iCloud云端恢复删除…...
nacos漏洞汇总
1 nacos介绍 1.1 nacos是啥 Alibaba Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
