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

news2024/11/23 13:03:36

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

摘要

本研究旨在针对大脑核磁图像中的黑色腔体进行有效分割,以提供可靠的腔体定位和分析。为此,采用了三种常用的图像分割方法: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:y
        if img_int(i,k) > thd
            img_bw(i,k) = 255;
        else
            img_bw(i,k) = 0;
        end
    end
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:y
        if img_edge(i,k) == 1
            img_src(i + 600,k + 700) = 255;
        end
    end
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) == 0
        min = i;
    else
        break;
    end
end
 
for i = 0:255            %寻找存在的最大灰度值
    if his(256 - i) == 0
        max = 256 - i;
    else
        break;
    end
end
 
for i = min+1:max
    sum = sum + his(i - 1);
    valueSum = valueSum + his(i - 1)*(i - 1);
    sum_low(i) = sum;
    sum_low_val(i) = valueSum;
end
 
for i = min+1:max
    low = 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_per
        g_per = g;
        thd = i;
    else
        break;
    end
    
end

end

邻域边界跟踪法

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

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

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

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

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

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

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

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

在这里插入图片描述

结果对比

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

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

传统算子提取的边界

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

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

论文 代码 获取方式

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

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

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

相关文章

机器学习基础入门(一)(机器学习定义及分类)

机器学习定义 给予计算机无需特意带有目的性编程便有学习能力的算法 深度学习算法 主要有监督学习和非监督学习两类 监督学习(supervised learning) 定义 1、学习由x映射到y的映射关系 2、主动给予机器学习算法正确示例,算法通过示例来学习…

NodeJS解压版环境配置

前往官网下载最新版NodeJS 下载地址:Node.js — Download Node.js 如下图选择“Prebuilt Binaries”(预构建二进制文件)进行下载 解压缩下载的zip压缩包 创建node_global与node_cache文件夹 node_global Node全局目录 node_cache Node缓存目录 设置…

php站长在线工具箱源码优化版

环境要求 PHP > 7.4MySQL > 5.6fileinfo扩展使用Redis缓存需安装Redis扩展 源码下载地址:php站长在线工具箱源码优化版.zip

创新之作:淘宝扭蛋机小程序,让购物与娱乐完美结合

淘宝扭蛋机小程序,是淘宝平台为您精心打造的一款集娱乐与购物于一体的全新体验。在这里,每一次的扭动都蕴含着无限的惊喜与乐趣,让您在轻松愉快的氛围中,发现更多心仪的商品,享受更多购物的乐趣。 我们深知您对新鲜事…

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

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

【Shell语言学堂】数组练习题

数组练习 1、使用数组和循环实现冒泡排序2、将冒泡排序的代码重构为2个函数,2个关系是a函数调用b函数自定义数组参数: 3、声明一个存储的全整数数组,对其中的每一个值进行10处理4、对硬盘使用空间占比的排序5、对当前目录的文件大小进行排序 …

Vue3 ts环境下的PropType

简介 在Typscript中,我们可以使用PropType进行类型的推断与验证。在日常的开发中我们常常会遇到下面这样的场景: 我们通过request请求从服务端获取了一条数据,数据是个Array的格式,Array中的每个元素又是一个对象,像下…

BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

问题描述: 农夫John的一头牛逃跑了,他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上,农夫John的初始位置为N(0≤N≤100,000),牛的初始位置为K(0≤K≤100,000)。农夫…

MySOL之旅--------MySQL数据库基础( 3 )

本篇碎碎念:要相信啊,胜利就在前方,要是因为一点小事就停滞不前,可能你也不适合获取胜利,成功的路上会伴有泥石,但是走到最后,你会发现身上的泥泞皆是荣耀的勋章! 今日份励志文案: 凡是发生皆有利于我 目录 查询(select) 1.全列查询 2.指定列查询 3.查询字段为表达式 ​编…

数据库被rmallox勒索病毒加密,如何还原?

近年来,网络安全问题日益严峻,勒索病毒作为其中的一种恶意软件,已成为网络安全领域的一大难题。其中,rmallox勒索病毒以其高度的隐蔽性和破坏性,给不少企业和个人带来了严重损失。本文将从rmallox勒索病毒的特点、传播…

【2024年MathorCup数模竞赛】C题赛题与解题思路

2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分,一是对时间序列进行预测,二是对人…

C++初阶:模板进阶

非类型模板参数 模板参数分为类型形参与非类型形参 。 类型形参即:出现在模板参数列表中,跟在 class 或者 typename 之类的参数类型名称 。 非类型形参,就是用一个常量作为类 ( 函数 ) 模板的一个参数,在类 ( 函数 ) 模板中可将…

7、configMap

1、configMap是什么 类似与pod的配置中心,不会因为pod的创建销毁,相关配置发生改变 pod定义硬编码意味着需要有效区分⽣产环境与开发过程中的pod 定义。为了能在多个环境下复⽤pod的定义,需要将配置从pod定义描 述中解耦出来。 2、向容器中…

HarmonyOS实战开发-证书管理、如何实现对签名数据进行校验功能。

介绍 本示例使用了ohos.security.certManager相关接口实现了对签名数据进行校验的功能。 实现场景如下: 1)使用正确的原始数据和签名数据进行签名校验场景:模拟服务端对签名数据进行校验,验证客户端身份和原始数据完整性。 2&…

智慧污水井物联网远程监控案例

智慧污水井物联网远程监控案例 在当今数字化转型的浪潮中,智慧水务已成为城市基础设施建设的重要组成部分。其中,基于物联网技术的智慧污水井远程监控系统以其高效、精准、实时的特性,在提升污水处理效能、保障城市水环境安全、实现精细化管…

数据资产可能是个伪命题?

✅作者简介:《数据运营:数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 🌸公众号:风姑娘的数字视角,免费分享数据应用相…

【分享】跨境虾皮Shopee各区域商品详情API返回值(商品,订单,面单等)♥

虾皮(shopee)是一个亚洲区域的电商平台,主要在东南亚地区提供电商服务。虾皮提供了丰富的电商数据,包括商品数据、订单数据、会员数据、评价数据等。 虾皮Shopee♥♥​​​​​​​♥​​​​​​​♥​​​​​​​♥​​​​​​​♥ 1.授权 ​ 接口…

Matlab 将数据写入excel文件

Matlab 将数据写入excel文件 函数:writematrix 功能:将矩阵写入文件 语法 writematrix(A) writematrix(A,filename) writematrix(___,Name,Value) 说明 writematrix(A) 将同构数组 A 写入以逗号分隔的文本文件。文件名为数组的工作区变量名称&…

点动、电子凸轮、电子齿轮

一、常见的运动模式有三种 1、点位运动:进队终点的位置有要求,不在乎运动轨迹。要求定位速度快。可分为JOG电动、MOVE寸动、和VMOVE持续运动三类。 2、连续轨迹运动:也称为插补,系统在高速运动的情况下,既要保证轮廓…

中文分词,c++应用,想到jieba分词,结果还的自己封装。探索中

一、研究背景 随着互联网的快速发展,信息也呈了爆炸式的增长趋势。在海量的信息中,我们如何快速抽取出有效信息成为了必须要解决的问题。由于信息处理的重复性,而计算机又善于处理机械的、重复的、有规律可循的工作,因此自然就…