多种子区域生长的图像分割

2023-11-09

基于多种子区域生长的图像分割

区域生长原理

步骤:

1.选取区域生长的起始点(种子)
2.确定区域生长的规则
3.确定结束生长的条件
4.寻找符合生长条件的点,纳入生长区域
5.以新纳入的点作为种子,继续步骤4,直到满足结束生长条件

理论基础

图像中同一个物体的像素往往具有一定的相似性,或许表现在颜色上,或许表现在明暗上,特别是在物体的边缘部分,像素的性质会发生比较明显的改变,这个相似性可以做为将其与其他物体区分开来的特征。而区域生长从某一点开始寻找周围与其在某些性质上相似的像素点(比如像素差值在某一阈值内的点),将其纳入同一个区域,从而可以将属于同一个物体的部分图片分割出来。

matlab代码

本人基于以上认识,编写区域生长的程序。该程序可以实现多种子区域生长,将物体与背景分割开来。本实验所用的图片如下
在这里插入图片描述
实验代码如下

function My_RegionGrowing(I,reg_maxdist)
%J=My_RegionGrowing(I,1);
close all
imshow(I);title('点击图片获取区域生长起始点');hold on;
[y0,x0]=ginput();%获取鼠标位置
plot(y0,x0,'p');hold off;%打起始印点
y0=int16(y0);%数据转换,防止矩阵索引错误
x0=int16(x0);
I=int16(I);%数据转换,uint8-->int16。使得像素差值可以为负数
[row, col] = size(I);               % 输入图像的维数 
[p_c1,p_c2]=size(y0);           % 起始点个数                      
Jc = zeros(row, col);        %生长区域矩阵
for c=1:1:p_c1   %遍历每一个起始点
    J = zeros(row, col);   %临时生长区域矩阵 ,若符合生长条件则赋值1
    J(x0(c), y0(c)) = 1;                             
    count = 1;              %新增加生长点的个数,用于判断是否停止生长                       
    reg_choose = zeros(row*col, 2);     %已经被生长的点
    reg_choose(1, :) = [x0(c),y0(c)];
    num = 1;               
    reg_num=1;
    while count > 0
        count = 0;
        for k = 1 : num      % 从新增的每个点遍历,避免重复
            i = reg_choose(reg_num - num + k, 1);
           j = reg_choose(reg_num - num +k, 2);
            if J(i, j) == 1 && i > 1 && i < row && j > 1 && j < col   % 不是边界点
               % %fprintf('(%d,%d)-%d -->',i,j,I(i,j))%%此处用于检查代码错误,mark一下
                for u =  -1 : 1      %八领域遍历
                    for v = -1 : 1
                        % 未处理且满足生长条件的点
                        if (J(i + u, j + v))==0%该点未生长
                            if (abs(I(i+u, j+v)- I(i, j))<=reg_maxdist)%符合生长条件
                                % %if(abs(I(i+u, j+v)- I(i, j)))<=1
                                %  %   fprintf('(%d,%d)-%d',i+u,j+v,I(i + u, j + v))
                                % %end
                            J(i + u, j + v) = 1;           % 对应点设置为1
                            count = count + 1;
                            reg_choose(reg_num + count, :) = [i + u, j + v];%保存新的点
                            end 
                        end
                    end
                end
               % %fprintf('\n')
            end
        end
        num = count;                                     
        reg_num = reg_num + count;              
    end
    Jc=Jc+J;%保存所有生长区域
end
I=uint8(I);
Jc=uint8(Jc);
I=I+255*Jc;
figure
imshow(I);title('区域生长完成的图片');

该代码的区域生长的种子点通过鼠标在图片上选取,点击图片上的点选取成功,选择完种子点后按下enter键开始区域生长。采用 对种子周围8领域的像素进行判断,周围点的像素值与种子点像素值的差值的绝对值小于设定的阈值则纳入生长区域(生长规则),当没有新的点纳入到生长区域后停止生长(结束条件)
采用阈值为2,结果如下:
在这里插入图片描述上图中的蓝色的点即为选取的初始种子点
在这里插入图片描述
结果可以接受,可以将图中的零件与背景区别开来
不足:只采用像素差值作为生长条件过于简单,可以看到零件中有许多点没有被纳入到生长区域之中。可以选用平均像素等作为生长条件,获得更好的效果。
欢迎指正和交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多种子区域生长的图像分割 的相关文章

  • XFocus Windows Internet 服务器安全配置

    Windows 2003版本区别 1 Windows Server 2003 Standard Edition 标准版 针对中小型企业的核心产品 他也是支持双路处理器 4GB的内存 它除了具备 Windows Server 2003 Web

随机推荐

  • Revit SDK下载地址

    20190325更新 共享了如下sdk REVIT 2014 SDK exe REVIT2015SDK SubscriptionRelease msi REVIT 2016 SDK msi Revit 2017 1 SDK Update O
  • 树莓派OpenWrt SD扩展问题

    树莓派OpenWrt磁盘扩展 1 查看问题 前几天给树莓派4B刷了OpenWrt当做软路由来使用 发现树莓派的SD卡空间没有完全被使用 有一部分未分区 已用大概只有2GB df h查看 2 fdisk 命令查看磁盘 3 按p查看分区情况 发
  • ansible自动化运维工具上部署lnmp架构

    ansible自动化运维工具上部署lnmp架构 ansible安装 通过ansible连接到192 168 228 20配置nginx安装 本地也要安装nginx 步骤略 安装mysql 安装PHP ansible自动化运维工具上部署lnm
  • Spring默认使用的JSON工具--Jackson

    Spring默认使用的JSON工具 Jackson 一 Jackson介绍 我们常用的json转换工具包括fastJson Gson Jackson等 其中Gson是Google所维护 功能全 fastJson特点是快 但是爆出几次的重大b
  • 2021最新版IDEA右侧Maven模块以及View下的Maven Project不见了解决方法

    问题描述 重新启动了一下IDEA后发现许多jar包找不到 想使用Maven进行依赖刷新 却找不到项目右侧的Maven Project 网上搜索了很多解决方法 如清除IDEA缓存 重启电脑 删除隐藏文件等等 都没有效果 将正确的解决方法记录在
  • Redis集群模式使用Lua脚本的限制

    问题复现 ERR bad lua script for redis cluster all the keys that the script uses should be passed using the KEYS array and KE
  • chapter15:springboot与监控管理

    Spring Boot与监控管理视频 1 简介 通过引入spring boot starter actuator 可以使用SpringBoot为我们提供的准生产环境下的应用监控和管理功能 我们可以通过http jmx ssh协议来进行操作
  • js宏观任务、微观任务

    js运行机制分为同步异步 异步又分为宏观事件和微观事件 同步异步 js是一门单线程语言 因此js在同一个时间里只能做一件事 单线程意味着 如果在同个时间有多个任务的话 这些任务就需要排队 前一个执行完成才能执行下一个任务 同步任务 同步任务
  • Linux之内核级防火墙selinux模块

    一 什么是selinux SELinux Security Enhanced Linux 是美国国家安全局 NSA 对于强制访问控制的实现 是 Linux历史上最杰出的新安全子系统 NSA是在Linux社区的帮助下开发了一种访问控制体系 在
  • c语言小游戏——扫雷

    扫雷是一款经典的单人益智游戏 玩家需要在一个由许多方块组成的棋盘上找出所有的地雷 而不触发任何一颗地雷 int input 0 do menu printf 请选择 gt scanf d input 输入1进入游戏 输入0退出游戏 输入其他
  • 我们总结了每个技术开发团队都会遇到的 4 个难题

    我们整理了一篇 每个技术团队都会遇到的4个难题 帮助即将从校园进入公司实习的后端程序员 以实践的视角 看看一个后端技术团队会遇到的一些难题 虽然 技术上的难题远不止于此 但如果能从这篇文章中获得一些职业体感 也许对你的实习面试会有所帮助 从
  • Python图像处理-3.pil裁剪、旋转粘贴图片

    from PIL import Image import matplotlib pyplot as plt pil im1 Image open pic1 png plt figure girlfriend1 plt imshow pil
  • c++中创建与调用dll

    文章目录 1 dll的创建 2 dll的使用 3 仅使用dll 显式链接 4 一点小的建议 好处想必不用说了 所谓的黑盒复用 实现模块化的同时避免源代码暴露等 可以将某一通用功能做成模块 方便复用 同时软件更新时如果只更新了几个模块 可以更
  • zookeeper

    先说 Paxos 它是一个基于消息传递的一致性算法 Leslie Lamport 在 1990 年提出 近几年被广泛应用于分布式计算中 Google 的 Chubby Apache 的 Zookeeper 都是基于它的理论来实现的 pxos
  • Vuejs学习八:map()函数

    定义 map 函数定义在JS的array中 它返回一个新的数组 数组中的元素为原生数据用函数处理后的值 map 不会对空数组进行检测 map 不会改变原始数组 let temp that caseTagsList map item gt i
  • WebSocket菜鸟教程二

    websocket服务器 多窗口显示数据案例 注意事项 1 因为WebSocket存在一段时间后自动断开链接的问题 故采用每次读写操作都重新链接的方式 2 服务端总链接数量有限 因此每次重新链接前应先关闭之前的链接 而不能直接创建链接 3
  • mysql(二)Explain详解

    目录 Explain用法 Explain的列详解 id select type table partitions type possible keys key key len ref rows filtered explain命令是查看My
  • vue路由监听失效

    场景 vue 2 6 10 vue router 3 0 2 写法一 watch route to from debugger 亲测 监听失效 写法二 watch route handler function val oldVal cons
  • 前、中、后缀表达式及其转换

    文章目录 一 前缀表达式 1 1 定义 1 2 求值 二 中缀表达式 2 1 定义 2 2 求值 三 后缀表达式 3 1 定义 3 2 求值 四 转换 4 1 中缀表达式转后缀表达式 4 2 中缀表达式转前缀表达式 一 前缀表达式 1 1
  • 多种子区域生长的图像分割

    基于多种子区域生长的图像分割 区域生长原理 步骤 理论基础 matlab代码 区域生长原理 步骤 1 选取区域生长的起始点 种子 2 确定区域生长的规则 3 确定结束生长的条件 4 寻找符合生长条件的点 纳入生长区域 5 以新纳入的点作为种