数字图像处理项目——模糊图像边缘检测算法设计及实现(论文/代码)

完整的论文代码见文章末尾 以下为部分内容

摘要

本研究旨在针对大脑核磁图像中的黑色腔体进行有效分割,以提供可靠的腔体定位和分析。为此,采用了三种常用的图像分割方法:8邻域区域生长法、Canny算子边缘检测和8邻域边界跟踪法。

首先,应用8邻域区域生长法来识别具有相似性质的像素,并将其合并为腔体区域。该方法基于种子点的选择和与相邻像素的相似性判断,能够快速而准确地生成初步的腔体分割结果。

其次,运用Canny算子边缘检测方法,通过计算图像梯度和非极大值抑制,实现对腔体边缘的精细检测。该算法能够提取出清晰的边缘信息,对于复杂的腔体结构有较好的适应性。

最后,采用8邻域边界跟踪法对初步分割得到的腔体边缘进行追踪,从起始点开始形成闭合的边界线。该方法通过遍历邻域像素点,递归地跟踪边界,并生成完整的腔体轮廓。

通过对比实验结果,本文对三种方法在黑色腔体分割方面的优劣进行了分析。基于分割准确性、计算效率和鲁棒性等因素,我们提出了最佳的分割策略,以获得最优的黑色腔体分割结果。

本研究的成果对于大脑核磁图像的进一步分析和诊断具有重要意义,为相关领域的研究和应用提供了有力支持。

关键词: 大脑核磁图像、分割、8邻域区域生长法、Canny算子边缘检测、8邻域边界跟踪法、优化策略

实现原理

邻域区域生长法

区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

简单来说下三个法则,对出需要分割的图像:

  • 选取图像中的一点为种子点(种子点的选取需要具体情况具体分析)。
  • 在种子点处进行8邻域或4邻域扩展,判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。
  • 当不再有像素满足加入这个区域的准则时,区域生长停止。

在这里插入图片描述

canny算子边缘检测

Canny边缘检测算法可以分为以下5个步骤:

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-MaximumSuppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。大小为(2k+1)x(2k+1)的高斯滤波器核的生成方程式由下式给出:

在这里插入图片描述

本节代码展示:

clear;
img_src = imread("brain.jpg");
img_gray = rgb2gray(img_src);
img_int = img_gray(600:1000,700:1400); %截取图片
imshow(img_int);
img_int = smoothdata(img_int,'gaussian',10);his = imhist(img_int);          %统计灰度直方图
[x,y] = size(img_int);
thd = getOSTUThreshold(his);    %获取大津法阈值
img_bw = zeros(x,y);        
for i = 1:x                     %二值化for k = 1:yif img_int(i,k) > thdimg_bw(i,k) = 255;elseimg_bw(i,k) = 0;endend
end SE = strel('rectangle',[50 50]);    %创建结构矩阵
img_bw = imdilate(img_bw,SE);       %图像腐蚀´
img_bw = imerode(img_bw,SE);        %图像膨胀
img_bw = 255 - img_bw;              %图像反转
img_bw = bwareaopen(img_bw,10000,8);% 去除小面积连通域
img_edge = edge(img_bw,'canny');    %canny算子检测边界
SE = strel('rectangle',[5 5]);
img_edge = imerode(img_edge,SE);   %对边界进行膨胀
imshow(img_edge);for i = 1:x                         %在原图中显示for k = 1:yif img_edge(i,k) == 1img_src(i + 600,k + 700) = 255;endend
end
imshow(img_src);
function thd = getOSTUThreshold(his)
sum = 0;        %个数和
valueSum = 0;   %值的和
g = 0;          %类间方差
g_per = 0;
low = 0;        %w1小于阈值的点数占比
high = 0;
ave_low = 0;     %u1小于阈值的值的平均
ave_high = 0;
min = 1;         %存在的最小灰度值
max = 256;
sum_low = zeros(256);       %存放低于阈值的像素点数总和,用于计算平均灰度sum_low_val = zeros(256);   %存放低于阈值的像素值总和for i = 1:256               %寻找存在的最小灰度值if his(i) == 0min = i;elsebreak;end
endfor i = 0:255            %寻找存在的最大灰度值if his(256 - i) == 0max = 256 - i;elsebreak;end
endfor i = min+1:maxsum = sum + his(i - 1);valueSum = valueSum + his(i - 1)*(i - 1);sum_low(i) = sum;sum_low_val(i) = valueSum;
endfor i = min+1:maxlow = sum_low(i) / sum;high = 1- low;ave_low = (sum_low_val(i) / sum_low(i));ave_high = ((valueSum - sum_low_val(i)) / (sum - sum_low(i)));g = (low * high * (ave_low - ave_high) * (ave_low - ave_high));if g >= g_perg_per = g;thd = i;elsebreak;endendend

邻域边界跟踪法

该算法基于以下原理:边界像素通常具有与其邻域像素明显不同的属性,例如亮度、颜色或纹理等。通过比较像素之间的差异,我们可以识别出边界。

下面是邻域边界跟踪法的基本步骤:

选择一个起始点作为边界的一部分。

检查当前像素的邻域像素(例如,上、下、左、右四个方向)。
根据预定义的条件判断当前像素是否属于边界。这些条件可以是像素灰度差异、颜色差异或梯度值等。

如果当前像素符合条件,则将其标记为边界点,并将其添加到边界集合中。

移动到下一个邻域像素,重复步骤3和步骤4,直到回到起始点或无法找到满足条件的邻域像素。

如果回到起始点,则边界跟踪完成;否则,选择一个新的起始点并重复步骤2到步骤5,直到图像中的所有边界都被跟踪完毕。

通过这种方式,我们可以在图像中获取连通的边界像素,并将它们组织成边缘。通常,边界跟踪算法会将边界像素连接起来,形成封闭的边缘。

在这里插入图片描述

结果对比

在方法1中,原本的思路是每次在灰度图中选去一个点来进行种子生长,但每次选取的位置不同,会出现意料之外的事,比如选择了腔体内的点,结果,生长的区域却在腔体外。因此为了实现功能,最后选择了一个固定的点来进行种子生长,相应地,种子生长在错误区域的情况也并没有发生,较好地完成了实验。

在方法2中,采用传统的图像处理方法,先对原图像进行一系列图像增强的操作,再利用图像形态学的知识对其进行分割,最后用边缘检测算子提取边界。对比二者结果来看,区域生长方法提取的边界更贴合目标,但边缘相对来说不够平滑,还是有待改进,而传统算子提取的边界由于一些部分的灰度值是缓慢变化的,效果不够理想,如粉色圈出的部分。

传统算子提取的边界

在这里插入图片描述
区域生长提取的边界
在这里插入图片描述

方法三中,由于二值化后没有进行平滑滤波以及闭操作,出来的边界也呈现出锯齿状。但因为二值化阈值为人工选取,所以不会出现区域不连通等情况,且边界与原图的匹配性也很好。而且可以发现,对模糊大图像进行处理时,先将图像缩小进行计算,再将结果进行放大是没有什么影响的,反而可以提高计算的效率。

论文 代码 获取方式

点这里 只需要一点点辛苦费。

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

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

相关文章

智算时代的基础设施如何实现可继承可演进?浪潮云海发布 InCloud OS V8 新一代架构平台

从 2023 年开始持续火爆的 AIGC 正在加速落地应用,为全行业带来生产生活效率的变革与升级。面对数字化转型与智能化转型,对于技术团队来说,既要根据业务与 AI 应用去部署以云为基础的 AI 算力,又要与已有数据和系统(甚…

酒店大厅装水离子雾化壁炉前和装后对比

在酒店大厅装水离子雾化壁炉之前和之后,大厅的氛围和体验会有显著的对比: 装水离子雾化壁炉之前: 传统感:在壁炉安装之前,大厅可能会有传统的装饰或者简单的暖气设备,缺乏现代化的元素。这种传统感可能会…

纯css实现switch开关

代码比较简单&#xff0c;有需要直接在下边粘贴使用吧~ html: <div class"switch-box"><input id"switch" type"checkbox"><label></label></div> css&#xff1a; .switch-box {position: relative;height: 25px…

C-开发 visual Studio扩展插件介绍-格式化插件Xaml Styler、CSharpier介绍(扩展插件安装方法)

C#开发 visual Studio扩展插件介绍 扩展插件安装方法Xaml StylerCSharpier 提高C#开发效率常用的插件 扩展插件安装方法 菜单栏点击“扩展”→“管理扩展”。 打开扩展页面 右上角搜索需要安装的插件&#xff0c;然后点击下载 安装完成后&#xff0c;根据提示关闭VS进行安…

记一次小郭被挖矿后的应急响应

谨以此篇纪念我第n1次被挖矿经历。 时间&#xff1a;2024年3月18日&#xff08;星期一&#xff09; 地点&#xff1a;阿里云服务器 响应&#xff1a;确认–>抑制–>消除–>恢复–>总结 确认阶段&#xff1a; 2024年3月18日星期一早上收到了阿里云的短信和邮件…

html+javascript,用date完成,距离某一天还有多少天

图片展示: html代码 如下: <style>* {margin: 0;padding: 0;}.time-item {width: 500px;height: 45px;margin: 0 auto;}.time-item strong {background: orange;color: #fff;line-height: 100px;font-size: 40px;font-family: Arial;padding: 0 10px;margin-right: 10px…

【hive】远程remote debug hive的方法,用于hive监听器/钩子编写

背景 写hive监听器时候需要拿到hive对象但hive是在集群linux主机上运行的。通过jdbc提交的sql具体执行过程不会再idea中运行。所以如果需要拿到hive对象有可能存在两个思路&#xff1a; &#xff08;1&#xff09;想办法写个钩子或者监听器&#xff0c;将需要的内容写成json字…

最简单的ubuntu安装docker教程

本文参考自docker官方教程&#xff1a;ubuntu上安装docker 一、安装Docker 第一步&#xff1a;添加Docker官方的GPG密钥 直接复制所有代码&#xff0c;作为一行运行即可 sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/k…

Python学习从0开始——项目一day01爬虫(二)

Python学习从0开始——项目一day01爬虫&#xff08;二&#xff09; 一、解析response数据二、json转换三、文件保存四、存储json对象五、完整代码 上一篇 一、解析response数据 在已经知道我们获取图片的最终URL存在于请求响应response中&#xff0c;下一步的重点就放在解析re…

Redis-底层数据结构

Redis-底层数据结构 redisObject对象机制对象共享引用计数以及对象的消毁 动态字符串SDS链表链表的优缺点: 压缩链表ziplist的缺点 字典-Dictrehash渐进式rehash 整数集-intSet内存分布图整数集合的升级 跳表 - ZSkipList快表-quicklistlistpack redisObject对象机制 typedef s…

DP10RF001一款200MHz~960MHz 低功耗(G)FSK/OOK无线收发芯片应用无线遥控工控设备无线门禁传感器等

产品概述 DP10RF001是一款工作于200MHz~960MHz范围内的低功耗、高性能、单片集成的(G)FSK/OOK无线收发机芯片。内部集成完整的射频接收机、射频发射机、频率综合器、调制解调器&#xff0c;只需配备简单、低成本的外围器件就可以获得良好的收发性能。芯片支持灵活可设的数据包…

Jmeter从数据为查找结果集数据方法随笔

一、Jmeter连接数据库 1.下载对应数据库的驱动包到jmeter安装目录的lib下ext文件中&#xff0c;并导入到jmeter的测试计划中&#xff0c;本实例中使用的是mysql如下所示&#xff1a; 点击测试计划–>点击浏览–>选中mysql驱动jar包–>打开 2.添加线程组&#xff0c;…

毕设(三)——nb-lot与onenet通信

文章目录 一、前言二、nb-lot与onenet的连接2.1 创建产品2.2 创建设备2.3 连接2.4 发送数据 三、onenet的数据可视化 刚刚看了一个关于nb-lot的视频&#xff0c;我看到up是用onenet原生的GUI就能做到数据的显示&#xff0c;十分亮眼 主要是它能把地图也一起显示出来&#xff0c…

2024mathorcup数学建模思路教学

大家好呀&#xff0c;认证杯数学建模开始了&#xff0c;来说一下选题建议以及思路吧&#xff1a; 首先定下主基调&#xff0c; 本次mathorcup数学应用挑战赛推荐大家选择C题&#xff0c;难度方面&#xff1a;A≈B&#xff1e;D&#xff1e;C。 我们预计4.13日晚上前更新完毕…

Stable Diffusion 本地部署教程:详细步骤与常见问题解析

作为一位热衷于探索前沿AI技术的博主&#xff0c;近期我深度研究了Stable Diffusion模型的本地部署过程。在这篇教程中&#xff0c;我将详述从环境准备到模型运行的每个步骤&#xff0c;并针对常见的部署问题给出解决方案&#xff0c;帮助你顺利在本地开启Stable Diffusion的创…

【图像处理】-小议YUV色彩空间-YUV和RGB格式的来由,相互关系以及转换方式,并对编程实现的YUV转为RGB程序进行介绍

小议YUV色彩空间 摘要: 在视频图像处理等相关相关领域&#xff0c;YUV是一个经常出现的格式。本文主要以图解的资料形式详细描述YUV和RGB格式的来由&#xff0c;相互关系以及转换方式&#xff0c;并对编程实现的YUV转为RGB程序进行介绍。 1 引言 自然界的颜色千变万化&#xff…

【前缀合】Leetcode 和可被 K 整除的子数组

题目解析 974. 和可被 K 整除的子数组 算法讲解 前置知识点&#xff1a; 同余定理&#xff1a;(ab) % c 0 可以得出 a % c b % cC中负数求余的结果是负数&#xff0c;但是本题需要的是正数&#xff0c;所以我们为了修正这个结果&#xff0c;需要进行(负数 % 正数 正数) %…

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

【数据结构】单链表(二)

目录 1.查找数据 2.指定位置插入和删除节点 2.1 指定位置之前插入节点 2.2 指定位置之后插入节点 2.3 删除指定位置节点 2.4 删除指定位置之后的节点 3.销毁链表 我们接着上一篇【数据结构】单链表&#xff08;一&#xff09;-CSDN博客 来继续实现单链表 1.查找数据 在…

2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

文章目录 如何让mybatis-plus的逻辑删除注解TableLogic临时失效1. 场景复现1.1 controller代码1.2 service层代码1.3 entity代码 2. 问题分析3. 解决方案3.1 说明3.2 核心代码3.3 service方法对应修改为3.4 运行结果 如何让mybatis-plus的逻辑删除注解TableLogic临时失效 1. 场…