当前位置: 首页 > news >正文

基于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的排列模式时&#xff0c…...

重磅消息: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提供了一组简单易用的特性集,可以快速实现动态服务发现、服…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

uniapp 字符包含的相关方法

在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...