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

这篇具有很好参考价值的文章主要介绍了19 区域生长用于图像分割(matlab程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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.运行结果

19 区域生长用于图像分割(matlab程序),matlab,人工智能,算法,图像处理,计算机视觉,深度学习,学习

 文章来源地址https://www.toymoban.com/news/detail-548700.html

19 区域生长用于图像分割(matlab程序),matlab,人工智能,算法,图像处理,计算机视觉,深度学习,学习

 19 区域生长用于图像分割(matlab程序),matlab,人工智能,算法,图像处理,计算机视觉,深度学习,学习

 

到了这里,关于19 区域生长用于图像分割(matlab程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python实现Open3D区域生长分割算法

    Open3D是一个用于三维数据处理的先进工具包,拥有丰富的函数和类来处理点云、网格等各种三维数据。而区域生长分割是一种普遍使用的方法,用于将点云分成不同的部分,以便进行后续处理。 本文将详细介绍如何使用Python编写Open3D区域生长分割算法,并给出完整代码和运行

    2024年02月10日
    浏览(33)
  • Open3D 点云分割之区域生长(Python版本,指定种子点)

    点云分割作为许多应用的前提,其直接会关乎到后续利用点云数据进行曲面重建、特征提取等处理的效果。区域生长算法做为一种较为经典的聚类分割算法,具有很广泛的应用,算法过程如下所述: 1、首先将按照每个点的曲率值由小到大进行排序。 2、选择曲率值最小的那个

    2024年02月03日
    浏览(30)
  • 41.利用matlab 平衡方程用于图像(matlab程序)

    1. 简述        白平衡 白平衡的英文为White Balance,其基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。 所谓的白平衡是通过对白色被摄物的颜色还原(产生纯白的色彩效果),进而达

    2024年02月14日
    浏览(34)
  • 图像处理技术:数字图像分割 ------ 图像分割、边界分割(边缘检测)、区域分割

    是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分 成若干个互不相交的区域,使得这些特征在同一区域内表现出一致 性或相似性,而在不同区域间表现出明显的不同 分割出来的区域应该同时满足:  (1)分割出来的图像区域的均匀性和连通性。 • 均匀性是指该

    2024年02月04日
    浏览(36)
  • 数字图像处理:图像分割——边缘检测与区域分割

    1.图像分割:根据图像的某些局部特征(灰度级、纹理、彩色或统计特征等)的相似性和互斥性,将图像分割成若干子区域,在每个子区域内部具有相似(相同或相近)特性,而相邻子区域的特性互斥。所以图像分割是利用图像局部特征的相似性和互斥性。 2.图像分割方法分

    2024年02月05日
    浏览(30)
  • 基于区域的图像分割

    基于区域的图像分割是数字图像处理中常用的一种方法,它通过将图像中的像素分配到不同的区域或对象来实现图像分割的目的。相比于基于边缘或阈值的方法,基于区域的图像分割更注重像素之间的相似性和连续性,能够更好地捕捉到图像中不同对象的区域特征。本文将介

    2024年02月05日
    浏览(34)
  • 文献速递:人工智能医学影像分割---人工智能辅助的CT分割用于体成分分析:一项验证研究

    Title 题目 Artificial intelligence-aided CT segmentation for body composition analysis: a validation study 人工智能辅助的CT分割用于体成分分析:一项验证研究 Abstract -Background 摘要-背景 Body composition is associated with survival outcome in oncological patients, but it is not routinely calculated. Manual segmentation of subcuta

    2024年01月23日
    浏览(38)
  • OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

    以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位 原图:   最终效果: 麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示:  基本方法:BoxFilter滤波、二值化、轮廓提取,凸包检测,图像的矩 代码如下: 灰度图像后图像二值化:

    2024年02月11日
    浏览(27)
  • 【区域生长】代码

    以下是基于Python的区域生长法完整代码: 该代码实现了基于区域生长法的光学影像目标识别,具体步骤如下: 读入原始光学影像,并将其转为灰度图像。 设定输入种子点的坐标和生长阈值。 定义名为 region_grow 的函数实现区域生长法,传入参数为原始光学影像、种子点和生

    2024年02月07日
    浏览(23)
  • 【论文阅读】Swin Transformer Embedding UNet用于遥感图像语义分割

    Swin Transformer Embedding UNet for Remote Sensing Image Semantic Segmentation 全局上下文信息是遥感图像语义分割的关键 具有强大全局建模能力的Swin transformer 提出了一种新的RS图像语义分割框架ST-UNet型网络(UNet) 解决方案:将Swin transformer嵌入到经典的基于cnn的UNet中 ST-UNet由Swin变压器和CNN并联

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包