19 区域生长用于图像分割(matlab程序)

news2024/9/22 13:25:22

1.简述

      

区域生长法
区域生长的基本思想是将具有相似性质的像素集中起来构建成分割区域。以一组种子点开始,将与种子性质相似(如灰度级)的领域像素附加到生长区域的每个种子上

算法步骤
a.随机选取图像中的一个像素作为种子像素,并将其表示出来

b.检索种子附近的未被标记的像素点,如果他们的差值在所规定的阈值内(阈值需要根据不同的情况进行设置),则合并到分割区域中

c.重复b步骤,直到区域停止扩张,并在此时再次随机选择非选定区域的一个像素做为种子像素

d.重复上述步骤,直到图像中的每个像素均被分配到不同的区域中
 

种子产生的方法

根据所解决问题的性质选择一个或多个起点
若无先验信息,则对每个像素计算相同的特性集,特性集在生长过程中用于将像素归属于某个区域
若这些计算的结果呈现了不同簇的值,则簇中心附近的像素可以作为种子
 终止规则

若没有像素满足加入到某个区域的条件时,则区域停止生长,终止规则的制定需要先验知识或先验模型。

相似度准则

灰度级类似准则
纹理类似准则
颜色类似准则

区域分裂与合并
区域分裂与合并算法的基本思路类似于微分,即无穷分割,然后将分割后满足相似度准则的区域进行合并。

阈值分割
阈值分割主要运用于灰度图像的分割。如果一张灰度图中目标和背景之间的灰度值有差异,则可以通过阈值分割的方法把图中的目标和背景分开。如果只选取一个阈值的分割被称为单阈值分割,会将图像分割成目标和背景两部分;如果选取多个阈值的分割被称为多阈值分割,会将图形分割成多个区域。

区域合并
区域合并可以看做区域生长的逆向过程,从整个图像出发,不断分割出子区域

实现区域生长法
 

对图像进行分割,得到脑部的单独图像。

2.代码

clear all
clc

I = imread('11.tif');
[m,n,l]=size(I);
if l==3
    I=rgb2gray(I);
end
figure(1),
imshow(I,[])
title('初始图像');
figure(2),
imhist(I)
title('初始图像的直方图');
T=30;                          %可以修改的阈值
f=double(I);
[m,n]=size(I);
shed1=zeros(3,round(m*n/2));   %存储区域生长方向上的点和该区域的均值的绝对差值和该点的坐标
sp1=0;                         % sp1 相当于指针,指向 shed1 中的最后放入的值和坐标
shed2=zeros(2,m);              %存储符合生长条件的点的坐标
sp2=0;                         % sp2 指针,指向 shed2 中的最后放入点的坐标
Cut=ones(size(f))*260;         % Cut 为区域生长后的新图像
hmin=min(min(f));
hmax=max(max(f));


h1 = waitbar(0,'Please wait...');
for q=hmin:hmax
for i=1:m
    for j=1:n
        if (f(i,j)==q&Cut(i,j)==260)  %确定该点满足作为种子的条件,且未并入已% 有生长区域
                                      %  Cut(i,j)=259;  % 259 时,标记该点在原图像的对应点已并入生长区域
            ave=f(i,j);               %确定新区域的均值的起始值
            k=1;                      %设置生成的区域的象素个数
            [Cut,shed1,sp1]=ruzhan(f,Cut,shed1,sp1,ave,i,j,m,n); %把周围的 8 个点入%栈
            [shed1,sp1]=arrange(shed1,sp1);  %对栈 shed1 的数据进行由大到小的排序
            [shed1,sp1,shed2,sp2]=listed(shed1,sp1,T,shed2,sp2);  %% 确定符合条件的生%%长点,将它从 shed1 中取出,并放入 shed2 中
        end
        % 根据生长点开始用 8 连通方式进行生长
        while (sp2~=0) %当 sp2=0 时表示找不到符合的点,
%             if (sp2~=0) %当有新的值加入区域时,求新的平均值
                sum=ave*k;
                for t=1:sp2
                    x=shed2(1,t);  y=shed2(2,t);
                    sum=sum+f(x,y);
                    k=k+1;
                end
                ave=sum/k;%%%%合并后的区域的均值
                         
            for t=1:sp2   %合并栈 shed2 中的点,生成新的区域
                x=shed2(1,t);  y=shed2(2,t);
                Cut(x,y)=q;
               [Cut,shed1,sp1]=ruzhan(f,Cut,shed1,sp1,ave,x,y,m,n);
            end
            sp2=0;
            [shed1,sp1]=arrange(shed1,sp1);             
            [shed1,sp1,shed2,sp2]=listed(shed1,sp1,T,shed2,sp2);   
        end   
        % 在一片区域生成之后,对栈 shed1(1,:)中未并入区域的值进行处理
        if (sp1~=0)
            for t=1:sp1
                x=shed1(2,t);  y=shed1(3,t);
                Cut(x,y)=260;
            end
            sp1=0;
            shed1=zeros(3,round(m*n/2)); 
            shed2=zeros(2,m);
        end
    end
end

  waitbar(q/(hmax-1))
end
max(max(Cut))

Cut=uint8(Cut);

imshow(Cut)

BW2 = edge(Cut,'sobel',0.000000000000001);

figure(22), imshow(BW2)
 %%   Cut为区域生长之后的图像
%%   将Cut中的区域的个数放在Cut1中,查看区域生长之后区域的个数和分布
clear k
Cut1=zeros(m,n);
Cut2=zeros(m,n);
Cut2=im2bw(Cut2);
k=1;
a=min(min(Cut));
b=max(max(Cut));
a=double(a);
b=double(b);
for i=a:b
    II=find(Cut==i);
    if length(II)~=0
        Cut2(II)=1;
        [L,num]=bwlabel(Cut2,8);
        for j=1:num
            III=find(L==j);
            Cut1(III)=k;
            k=k+1;
        end
        Cut2(II)=0;
    end
end
a1=max(max(Cut1))
a2=min(min(Cut1))    

%%     将Cut1中的区域进行合并,将合并之后的区域放在Z4中

a1=double(a1);
f=I;
f=double(f);
Z1=Cut1;
Z2=Z1;
Z3=Z1;
[m,n]=size(Z1);
for i=1:a1
    
    [L,H]=find(Z1==i);
    if length(L)<=200%若区域太小,则合并
        j=1;
        for i1=1:length(L)
             if (L(i1)-1>0)&(H(i1)-1>0)
                  if Z1(L(i1)-1,H(i1)-1)~=i
                       zhan(1,j)=Z1(L(i1)-1,H(i1)-1);
                       j=j+1;
                  end
             end
             if L(i1)-1>0
                  if Z1(L(i1)-1,H(i1))~=i
                       zhan(1,j)=Z1(L(i1)-1,H(i1));
                       j=j+1;
                  end
             end
             if (L(i1)-1>0)&(H(i1)+1<=n)
                  if Z1(L(i1)-1,H(i1)+1)~=i
                       zhan(1,j)=Z1(L(i1)-1,H(i1)+1);
                       j=j+1;
                  end
             end
             if (H(i1)-1>0)
                  if Z1(L(i1),H(i1)-1)~=i
                       zhan(1,j)=Z1(L(i1),H(i1)-1);
                       j=j+1;
                  end
              end
              if (H(i1)+1<=n)
                  if Z1(L(i1),H(i1)+1)~=i
                       zhan(1,j)=Z1(L(i1),H(i1)+1);
                       j=j+1;
                  end
              end   
              if (H(i1)+1<=n&L(i1)+1<=m)
                  if Z1(L(i1)+1,H(i1)+1)~=i
                       zhan(1,j)=Z1(L(i1)+1,H(i1)+1);
                       j=j+1;
                  end
              end   
              if (L(i1)+1<=m)
                  if Z1(L(i1)+1,H(i1))~=i
                       zhan(1,j)=Z1(L(i1)+1,H(i1));
                       j=j+1;
                  end
              end     
              if (L(i1)+1<=m&H(i1)-1>0)
                  if Z1(L(i1)+1,H(i1)-1)~=i
                       zhan(1,j)=Z1(L(i1)+1,H(i1)-1);
                       j=j+1;
                  end
              end     
        end    %%%%%%%%%%%%%%将和这些点相连的那些点放入矩阵zhan中
       if ~isempty(zhan)
           y(1,1)=zhan(1,1);
           j1=2;
           for i3=2:length(zhan)
               for i4=1:length(y)
                   if zhan(1,i3)~=y(1,i4)
                       k=1;
                       break
                   else
                       k=0;
                   end
               end
               if k==1
                   y(1,j1)=zhan(1,i3);
                   j1=j1+1;
               end
           end
       end  
    
   %%    以上将zhan里面的元素不同的元素放在y矩阵中
   %%    以下将当前区域合并到与之相邻的区域中,规则为平均灰度值最接近,合并后的矩阵为Z2;
   if length(y)==1
       for i5=1:length(L)
           Z2(L(i5),H(i5))=y(1,1);
       end  
   else
       s1=0;
       for i6=1:length(L)
           s1=s1+f(L(i6),H(i6));      %%为要处理的像素的总灰度值
       end
       s=0;
       II=find(Z1==y(1,1));
       for i7=1:length(II)
           s=s+f(II(i7));               %%%为第一个总灰度值
       end
       cha=abs(s-s1);
       log=y(1,1);
       for i8=2:length(y)
           II=find(Z1==y(1,i8));
           s2=0;
           for i9=1:length(II)
               s2=s2+f(II(i9));
           end
           cha1=abs(s1-s2);
           if cha1<cha
               cha=cha1;
               log=y(1,i8);
           end
       end
       for i10=1:length(L)
           Z2(L(i10),H(i10))=log;          %%合成之后的为Z2矩阵
       end
   end
  end
   Z1=Z2;  
   zhan=[];
   y=[];
   k=0;   
end
   Z4=zeros(m,n);
   k=1;
   m1=min(min(Z1));
   m2=max(max(Z1));
   for i11=m1:m2
       II=find(Z1==i11);
       if ~isempty(II)
           Z4(II)=k;
           k=k+1;
       end
   end
 
   max(max(Z4))           %%分成的区域的个数
   min(min(Z4)) 
                           %%%%a1为Cut中的区域个数
   
BW2 = edge(Z4,'sobel',0.000000000000001);
figure(30),imshow(BW2);

   Lrgb = label2rgb(Z4);
 figure(33), imshow(Lrgb), title('Lrgb')
 imwrite(Lrgb,'C:\Documents and Settings\Administrator\桌面\lena30_200.tif')
 III=find(BW2==1);
 I(III)=255;
 figure(32),imshow(I)
  imwrite(I,'C:\Documents and Settings\Administrator\桌面\lena_I.tif')
im2=xiaos_ipolartrans(Z4, 256, 256, 128, 128,'log','valid');
figure(44),imshow(im2,[])
X44=mat2gray(im2)
imwrite(X44,'C:\Documents and Settings\Administrator\桌面\lena_huanyuan.tif')
 

3.运行结果

 

 

 

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

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

相关文章

说一说spring boot服务的健康检测

一、判断服务的健康状态 服务健康与否&#xff0c;对我们的重要性&#xff0c;主要是体现在应用部署与服务调用。具体可以是如下&#xff1a; consul/nacos 服务注册中心api网关docker/k8s 容器部署发版结果应用监控 服务注册中心要对外提供服务&#xff0c;仅限于健康的节点…

天猫厨房大电市场分析(淘宝天猫数据)

如今&#xff0c;消费者对于厨房电器的需要不断增长&#xff0c;厨房电器领域的发展规模也越来越大。在国内市场中&#xff0c;由于中国人在烹饪时喜欢煎炒烹炸&#xff0c;油烟较重&#xff0c;因此&#xff0c;以油烟机和燃气灶为代表的厨房大电也成为千家万户不可少的厨用电…

2023黑马头条.微服务项目.跟学笔记(四)

2023黑马头条.微服务项目.跟学笔记 四 自媒体文章-自动审核今日内容介绍1.自媒体文章自动审核流程2.内容安全第三方接口2.1 概述2.2 准备工作2.3 文本内容审核接口2.4 图片审核接口2.5 项目集成 3.app端文章保存接口3.1 表结构说明3.2 分布式id3.3 思路分析3.4 feign接口 4.自媒…

常用的 34 个 Linux Shell 脚本,一定能帮到你!

作为一名 Linux 工程师&#xff0c;会写好的脚本不仅能提高工作效率&#xff0c;还能有更多的时间做自己的事。最近在网上冲浪的时候&#xff0c;也注意收集一些大佬写过的脚本&#xff0c;汇总整理一下&#xff0c;欢迎收藏&#xff0c;与君共勉&#xff01; &#xff08;1&a…

antd-React Popover 点击空白不隐藏

1.问题原因&#xff1a;自己写的点击事件把默认事件覆盖掉了&#xff0c;所以点击会不生效 2.解决方案&#xff1a;给按钮在添加一个焦点事件即可&#xff0c;当失去焦点的时候取反 3.代码如下 const [closeVisible, setCloseVisible] useState(false);<Popover content{c…

SSM学习笔记-------Spring(三)

SSM学习笔记-------Spring&#xff08;三&#xff09; Spring_day031、AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2、AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点 步…

在任何文件夹下打开jupyter 内核都是同一个文件夹

我在 D:\anaconda实例代码 下打开jupyter notebook 无论我在那个文件下打开jupyter 都是同一个文件这是因为你可能在jupyter notebook 的那个配置文件中设置固定的路径 假如你的.py 文件在D:\anaconda实例代码 下 你想通过jupyter notebook 运行它很简单 上传到jupyter notebo…

Linux系统运行时参数命令(性能监控、测试)(2)虚拟内存和物理内存、内存性能监控、文件IO性能监控

目录 3. 内存性能监控3.1 内存是什么-虚拟内存和物理内存3.1.1 为什么需要有虚拟内存3.1.2 虚拟内存的原理 3.2 内存中的buffer和cache3.2.1 buff/cache3.2.2 **free 与 available** 4.文件IO性能监控4.1 IO的两种方式4.1.1 缓存IO4.1.2 直接IO 4.2 监控磁盘IO的命令4.2.1 iost…

【指针进阶】

1 字符指针 #include <stdio.h> int main() {char str1[] "hello bit.";char str2[] "hello bit.";const char* str3 "hello bit.";const char* str4 "hello bit.";if (str1 str2)printf("str1 and str2 are same\n&…

DataEase安装与教程,人人都会的大数据可视化与BI工具!!!

文章目录 一 DataEase介绍1.1 可视化工具介绍1.2 什么是 DataEase1.3 DataEase 的优势1.4 DataEase 支持的数据源1.5 DataEase 模板市场1.6 快速开始 二 Dataease安装部署2.1 登陆DataEase2.2 DataEase界面2.3 数据源连接2.4 数据集2.5 看板案例 一 DataEase介绍 1.1 可视化工…

第三节 给SpringBootAdmin的client端加入spring security安全控制

前言 本来想用一节就写完SpringBootAdmin的&#xff0c;但随着研究的深入发现一节应该是不够的&#xff0c;网上的资料也不会非常系统&#xff0c;官网的例子有些已经好几年没更新了&#xff0c;所以接下来还是系统性的来写下吧 第一节 完成基础配置&#xff0c;暴露所有端点…

B2B2C商城模式适合哪些的企业?

随着互联网的发展&#xff0c;电商也变得的越来越火热&#xff0c;很多个人和企业进驻其中&#xff0c;所以竞争激烈&#xff0c;如天猫和京东&#xff0c;他们内部的店家多不胜数&#xff0c; 在这种大环境下&#xff0c;企业开始做出不一样的举动&#xff0c;纷纷都搭建一个b…

samba参数配置教程(samba配置参数讲解)(/etc/samba/smb.conf )

文章目录 samba smb.conf配置文档smb.conf重要配置参数讲解1. workgroup&#xff1a;指定Samba服务器所在的工作组名称。2. server string&#xff1a;指定Samba服务器的描述信息。3. security&#xff1a;指定Samba服务器的安全模式&#xff0c;可以是user、share或domain。4.…

ssh配置多账号(Mac)

一. 应用场景 当存在同时需要git在GitHub、gitee、gitlab等多个不同git托管平台进行ssh代码操作的时候。 二. 具体操作 默认 ssh-keygen -t rsa -C "你的邮箱"之后一直回车就可以&#xff0c;会默认在~/.ssh目录下生成id_rsa、id_rsa.pub 指定文件 ssh-keygen …

实验九 单周期MIPS CPU设计实验(基于Logisim)

一、实验目的 学生掌握控制器设计的基本原理&#xff0c;能利用硬布线控制器的设计原理在Logisim平台中设计实现MIPS单周期CPU。 二、实验内容 利用运算器实验&#xff0c;存储系统实验中构建的运算器、寄存器文件、存储系统等部件以及Logisim中其它功能部件构建一个32位MIPS …

基本数据类型转换

自动类型转换 当Java程序在进行赋值或运算时&#xff0c;精度小的类型自动转换为精度大的数据类型&#xff0c;这个就是自动类型转换。 int a 3; double d a; // 类型转换 int --> double自动类型转换使用和细节&#xff1a; 有多种类型的数据混合运算时&#xff0c;系统…

基于Java养老院老人健康监护平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

element-ui组件中的Tooltip 文字提示:el-tooltip中content是变量怎么写

<el-tooltip content"Top center" placement"top"><el-button>Dark</el-button> </el-tooltip> 这样的效果是&#xff1a; 可以看出&#xff0c;content是提示内容。如果是文字提示可以直接写在content里面。 content是变量应该…

飒智智能机器人核心技术与应用论坛暨一体化控制器发布会成功举办

7月6日&#xff0c;智能机器人核心技术与应用论坛暨移动操作复合机器人一体化智能控制器发布会在上海举行。本次活动由上海飒智智能科技有限公司主办&#xff0c;得到上海市经信委、闵行区科委、闵行区经委、“大零号湾”属地单位南滨江公司、江川路街道办事处的支持&#xff0…

给大模型持久记忆!GitHub 2万星向量数据库云服务升级,国内云产品下周上线

一个在GitHub上标星超2万的数据库&#xff0c;究竟是什么来头&#xff1f; 原来&#xff0c;这正是最近大火的向量数据库之一、首个在这一赛道开源产品Milvus。 自大模型爆火以来&#xff0c;它的关注度也一路飙升&#xff0c;官方显示&#xff0c;目前Milvus已经拥有超过1000企…