精华内容
下载资源
问答
  • 区域生长法MATLAB版本程序代码,需要把图像名字改成程序里一致的 区域生长法MATLAB版本程序代码,需要把图像名字改成程序里一致的
  • 利用区域生长法来实现图像分割,本人已经用肝部CT图像来测试过,非常好用。
  • 区域生长法MATLAB

    2020-07-08 20:01:09
    区域生长算法的设计主要由以下三点:生长种子点的确定,区域生长的条件,区域生长停止的条件。 代码采用交互的方式,用鼠标选取合适的种子点,搜索种子点8邻域内的像素。
  • 区域生长matlab代码

    2015-04-16 15:07:42
    区域生长代码matlab实现 手动点选种子点,根据设置的阈值(可更改),进行区域生长
  • 区域生长法分割matlab代码球体成像 项目 6 - 多细胞肿瘤球体的分割 Baptiste Alberti - Tanguy Pace - Titouan Poquillon - Pierrick Ullius 文件的组织 代码文件夹 该文件夹包含所有 Matlab 代码文件和 Ilastik ...
  • 区域生长法分割matlab代码执行摘要 该项目旨在自动化 CNT TEM 图像的直径测量。 目前,它可以区分包含适合测量的 CNT 的感兴趣区域和不包含的感兴趣区域。 这是实现整个过程自动化的第一个障碍。 问题陈述 研究人员...
  • 基于区域生长法的图像分割matlab代码 DIPBigHW 下载此代码 命令行下载 git clone https://github.com/githubxiaowei/DIPBigHW.git 或者如图直接点击下载: 数据集下载 数 据 集 下 载 链 接 ( 图 像 + 所 有 标 注 ...
  • 基于区域生长法的图像分割matlab代码明显的结果 该存储库中的代码是Shih和Cheng撰写的论文“用于彩色图像分割的自动播种区域生长”的MATLAB实现。 该方法包括4个主要部分: 将RGB图像转换为YCbCr颜色空间 自动选种 ...
  • MATLAB 区域生长代码 能运行 !
  • 基于区域生长法的图像分割matlab代码这些代码在“磁化传递加权EPI有助于原生fMRI空间中皮层深度的确定”一文中使用。 它使用了公开可用的软件包,包括AFNI,SPM,ANT,FreeSurfer和LAYNII。 数据位于 作者:柴玉辉,...
  • 基于种子点和分割阈值的区域生长实现代码,以种子点为中心,由右、下、左、上的顺序实现由内而外的生长。
  • (2)区域生长matlab代码

    2019-10-24 23:03:17
    ///////////////////////(1) 单点区域生长---脚本文件////////////////////// %% 目标颜色检测--RGB转化为HSV clc;clear; image = imread( 'exercises_1.bmp'); imshow(image);title('原图'); % imwrite(image,'./...

    以此为后之参考:

          

    ///(1) 单点区域生长---脚本文件//

    %% 目标颜色检测--RGB转化为HSV
    clc;clear;
    image = imread( 'exercises_1.bmp');
    imshow(image);title('原图');
    % imwrite(image,'./outputs_image/first_step/origin.jpg');
    % imwrite(image,'./outputs_image/second_step/origin.jpg');
    imwrite(image,'./outputs_image/third_step/origin.jpg');
    image_hsv = rgb2hsv(image);                                          % 将RGB值转换到HSV值,便于颜色识别,
    %imshow(image_hsv);                                                  % 其中H(色调)——S(饱和度)——V(亮度)
    [H,W,K] = size(image);                                               % 读取图像的高宽和通道值,K=1,2,3对应HSV
    srcData = [H,W,K];                                                   % 将图像的宽高和色彩信息存入srcData
    for i = 1:H                                                          % 遍历图像
        for j = 1:W
            h = image_hsv(i,j,1);                                        % 读取图像的HSV值,便于后面的色彩识别 
            s = image_hsv(i,j,2);
            v = image_hsv(i,j,3);
             % 物体从上到下进行识别
            %% 蓝色物体
            if 0.40<h && h<0.667 && s>0.15 && v>0.2                      % 将h(0.4-0.667)和s(0.15-1)-->h=0,s=0.8,v=0.8()
                image_hsv(i,j,1) = 0;
                image_hsv(i,j,2) = 0.8;
                image_hsv(i,j,3) = 0.8;
            end
            %% 明黄色物体
            if 0.167<h && h<0.333 && s>0.4                               % 将h(0.167-0.333)和s(0.4-1)-->h=0.5,s=1(绿)
                image_hsv(i,j,1) = 0.333;
                image_hsv(i,j,2) = 1;
            end
            %% 屎黄色物体
            if 0<h && h<0.167 && s>0.65                                  % 将h(0-0.167)和s(0.65-1)-->h=0.833,s=1(紫)
                image_hsv(i,j,1) = 0.833;
                image_hsv(i,j,2) = 1;
            end
            %% 粉红色物体
            if 0.9<h && h<1 && s>0.5                                     % 将h(0.9-1)和s(0.5-1)-->h=0.6,v=0.8(蓝)
                image_hsv(i,j,1) = 0.6;
                image_hsv(i,j,3) = 0.8;
            end
            %% 黑色物体
            if  s<0.45  && v>0 && v<0.17                                  % 将s(0-0.1)和v(0-0.17)-->h=0.6,v=0(黑)
                image_hsv(i,j,3) = 0;
            end
        end
    end
    image_show = hsv2rgb(image_hsv);
    % figure;
    % imshow(image_show);title('检测结果');
    % imwrite(image_show,'./outputs_image/first_step/result.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画1个白色图像
    flag_1 = 255*ones(size(image)); % 创建一个白色图像,将特定颜色提取到此处,其中ones生成数值全为1的数组,zeros生成数值为0
    s=ones(3);                                                           % 定义结构元素
    se=ones(4); 
    sel=ones(5);
    sel_1=ones(1);
    sel_2=ones(2);
    sel_3=ones(6);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出检测出的蓝色物体
    flag_hsv_1 = rgb2hsv(flag_1);  
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0 & image_hsv(:,:,1)>=0 ...
    & image_hsv(:,:,2)<=0.8 & image_hsv(:,:,2)>= 0.8 ...                 % 其中ind2sub--按照size指定的矩阵形式将索引(index)转化为行列形式
    & image_hsv(:,:,3)<=0.8 & image_hsv(:,:,3)>=0.8));
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_1(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_1);

    figure;
    subplot(1,2,1);
    imshow(image_flag);title('检测出的蓝色物体');
    imwrite(image_flag,'.\outputs_image\first_step\1.jpg');
    %% 对蓝色物体形态学滤波
    I2=imopen(image_flag,s);                                             % 开运算,去除白色噪点
    I3=imdilate(I2,s);                                                   % 膨胀消除除被检测物体外的其他小红点

    subplot(1,2,2);
    % figure;
    imshow(I3);title('形态学滤波');
    imwrite(I3,'.\outputs_image\second_step\1.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出检测出的明黄色物体
    flag_hsv_2 = rgb2hsv(flag_1);  
    % flag_hsv_2 = rgb2hsv(image_flag);  
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.333 & image_hsv(:,:,1)>=0.333 ...
    & image_hsv(:,:,2)<=1 & image_hsv(:,:,2)>= 1));                      % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_2(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_2);

    figure;
    subplot(1,2,1);
    imshow(image_flag);title('检测出的明黄色物体');
    imwrite(image_flag,'.\outputs_image\first_step\2.jpg');
    %% 对明黄色形态学滤波
    I2=imopen(image_flag,se);                                            % 去除白色噪声点
    I4=imdilate(I2,s);                                                   % 去除除物体外的带颜色的其他噪声点

    subplot(1,2,2);
    % figure;
    imshow(I4);title('形态学滤波');
    imwrite(I4,'.\outputs_image\second_step\2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出屎黄色物体
    flag_hsv_3 = rgb2hsv(flag_1);  
    % flag_hsv_3 = rgb2hsv(image_flag); 
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.833 & image_hsv(:,:,1)>=0.833 ...
    & image_hsv(:,:,2)<=1 & image_hsv(:,:,2)>= 1));                      % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_3(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_3);

    figure;
    subplot(1,2,1);
    imshow(image_flag);title('检测出的屎黄色物体');
    imwrite(image_flag,'.\outputs_image\first_step\3.jpg');
    %% 对屎黄色形态学滤波
    I2=imopen(image_flag,s);                                             % 去除白色噪声点
    I2=imdilate(I2,sel);                                                 % 去除除物体外的带颜色的其他噪声点
    I5=imerode(I2,se);                                                   % 将膨胀消失的物体边缘部分恢复

    subplot(1,2,2);
    % figure;
    imshow(I5);title('形态学滤波');
    imwrite(I5,'.\outputs_image\second_step\3.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出粉红色物体
    flag_hsv_4 = rgb2hsv(flag_1);  
    % flag_hsv_4 = rgb2hsv(image_flag); 
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.6 & image_hsv(:,:,1)>=0.6 ...
    & image_hsv(:,:,3)<=0.8 & image_hsv(:,:,3)>= 0.8));                  % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_4(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_4);

    figure;
    subplot(1,2,1);
    imshow(image_flag);title('检测出的粉红色物体');
    imwrite(image_flag,'.\outputs_image\first_step\4.jpg');
    %% 对粉红色形态学滤波
    I2=imdilate(image_flag,sel_2);                                       % 去除除物体外的带颜色的其他噪声点
    I6=imerode(I2,sel_3);                                                % 将膨胀消失的物体边缘部分恢复

    subplot(1,2,2);
    % figure;
    imshow(I6);title('形态学滤波');
    imwrite(I6,'.\outputs_image\second_step\4.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出黑色物体
    flag_hsv_5 = rgb2hsv(flag_1);  
    % flag_hsv_5 = rgb2hsv(image_flag); 
    [row, col] = ind2sub(size(image_hsv),find( image_hsv(:,:,3)<=0 & image_hsv(:,:,3)>= 0));                 % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_5(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_5);

    figure;
    subplot(1,2,1);
    imshow(image_flag);title('检测出的黑色物体');
    imwrite(image_flag,'.\outputs_image\first_step\5.jpg');
    %% 对黑色形态学滤波
    I2=imdilate(image_flag,sel_1);                                        % 去除除物体外的带颜色的其他噪声点
    I7=imerode(I2,s);                                                     % 腐蚀

    subplot(1,2,2);
    % figure;
    imshow(I7);title('形态学滤波');
    imwrite(I7,'.\outputs_image\second_step\5.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 单点区域生长
    % for image_number=1:5
    %     imageName=strcat(num2str(image_number),'.jpg');
    %     img = im2double(imread(imageName));
    %     img1 = rgb2gray(img);
    %     image1 = imresize(img1,[256,256]);
    %     figure, imshow(image1,[]);[y,x]=getpts; y=round(y); x=round(x); 
    %     image1_region = RegionGrowing(image1,x,y); 
    %     figure, imshow(image1_region);
    % end
    %% 多点区域生长
    for image_number=1:5
        imageName=strcat(num2str(image_number),'.jpg');
        image1 = CallRegionGrowing(imageName);
        imwrite(image1,strcat(num2str(image_number),'_1.jpg'));
    end

    /(2) 多点区域生长 ---脚本文件/

    %% 目标颜色检测--RGB转化为HSV
    clc;clear;
    image = imread( 'exercises_1.bmp');
    imshow(image);title('原图');
    imwrite(image,'./outputs_image/fourth_step/origin.jpg');
    image_hsv = rgb2hsv(image);                                          % 将RGB值转换到HSV值,便于颜色识别,                                               % 其中H(色调)——S(饱和度)——V(亮度)
    [H,W,K] = size(image);                                               % 读取图像的高宽和通道值,K=1,2,3对应HSV
    srcData = [H,W,K];                                                   % 将图像的宽高和色彩信息存入srcData
    for i = 1:H                                                          % 遍历图像
        for j = 1:W
            h = image_hsv(i,j,1);                                        % 读取图像的HSV值,便于后面的色彩识别 
            s = image_hsv(i,j,2);
            v = image_hsv(i,j,3);
             % 物体从上到下进行识别
            %% 蓝色物体
            if 0.40<h && h<0.667 && s>0.15 && v>0.2                      % 将h(0.4-0.667)和s(0.15-1)-->h=0,s=0.8,v=0.8()
                image_hsv(i,j,1) = 0;
                image_hsv(i,j,2) = 0.8;
                image_hsv(i,j,3) = 0.8;
            end
            %% 明黄色物体
            if 0.167<h && h<0.333 && s>0.4                               % 将h(0.167-0.333)和s(0.4-1)-->h=0.5,s=1(绿)
                image_hsv(i,j,1) = 0.333;
                image_hsv(i,j,2) = 1;
            end
            %% 屎黄色物体
            if 0<h && h<0.167 && s>0.65                                  % 将h(0-0.167)和s(0.65-1)-->h=0.833,s=1(紫)
                image_hsv(i,j,1) = 0.833;
                image_hsv(i,j,2) = 1;
            end
            %% 粉红色物体
            if 0.9<h && h<1 && s>0.5                                     % 将h(0.9-1)和s(0.5-1)-->h=0.6,v=0.8(蓝)
                image_hsv(i,j,1) = 0.6;
                image_hsv(i,j,3) = 0.8;
            end
            %% 黑色物体
            if  s<0.45  && v>0 && v<0.17                                  % 将s(0-0.1)和v(0-0.17)-->h=0.6,v=0(黑)
                image_hsv(i,j,3) = 0;
            end
        end
    end
    image_show = hsv2rgb(image_hsv);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画1个白色图像
    flag_1 = 255*ones(size(image)); % 创建一个白色图像,将特定颜色提取到此处,其中ones生成数值全为1的数组,zeros生成数值为0
    s=ones(4);                                                           % 定义结构元素
    se=ones(1);

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出检测出的蓝色物体
    flag_hsv_1 = rgb2hsv(flag_1);  
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0 & image_hsv(:,:,1)>=0 ...
    & image_hsv(:,:,2)<=0.8 & image_hsv(:,:,2)>= 0.8 ...                 % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    & image_hsv(:,:,3)<=0.8 & image_hsv(:,:,3)>=0.8));
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_1(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_1);

    figure;
    imshow(image_flag);
    imwrite(image_flag,'.\outputs_image\fourth_step\1_2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出检测出的明黄色物体
    flag_hsv_2 = rgb2hsv(image_flag);   
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.333 & image_hsv(:,:,1)>=0.333 ...
    & image_hsv(:,:,2)<=1 & image_hsv(:,:,2)>= 1));                      % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_2(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_2);

    figure;
    imshow(image_flag);
    imwrite(image_flag,'.\outputs_image\fourth_step\2_2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出屎黄色物体
    flag_hsv_3 = rgb2hsv(image_flag);  
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.833 & image_hsv(:,:,1)>=0.833 ...
    & image_hsv(:,:,2)<=1 & image_hsv(:,:,2)>= 1));                      % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_3(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_3);

    figure;
    imshow(image_flag);
    imwrite(image_flag,'.\outputs_image\fourth_step\3_2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出粉红色物体
    flag_hsv_4 = rgb2hsv(image_flag);  
    [row, col] = ind2sub(size(image_hsv),find(image_hsv(:,:,1)<=0.6 & image_hsv(:,:,1)>=0.6 ...
    & image_hsv(:,:,3)<=0.8 & image_hsv(:,:,3)>= 0.8));                  % 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_4(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_4);

    figure;
    imshow(image_flag);
    imwrite(image_flag,'.\outputs_image\fourth_step\4_2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 画出黑色物体
    flag_hsv_5 = rgb2hsv(image_flag);  
    % flag_hsv_5 = rgb2hsv(image_flag); 
    [row, col] = ind2sub(size(image_hsv),find( image_hsv(:,:,3)<=0 & image_hsv(:,:,3)>= 0));% 其中indsub--按照size指定的矩阵形式将索引(index)转化为行列形式
    for i = 1 : length(row)                                              % 将图像中的绿色像素复制到刚才新建的白色图像中
        flag_hsv_5(row(i),col(i),:) = image_hsv(row(i),col(i),:);
       
    end
    image_flag = hsv2rgb(flag_hsv_5);

    figure;
    imshow(image_flag);
    imwrite(image_flag,'.\outputs_image\fourth_step\5_2.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 形态学滤波
    image2=imopen(image_flag,s);                                         % 去除白色噪声点
    imshow(image2);
    imwrite(image2,'.\outputs_image\fourth_step\all.jpg');

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% 多点区域生长
    image1 = CallRegionGrowing('all.jpg');
    imwrite(image1,'all_1.jpg');

    /(3) 多点区域生长函数文件//

    function J1 = CallRegionGrowing(filename)
    I= im2double(imread(filename));            % 将读取的图像数据转化为双精度
    I=rgb2gray(I);
    % I=imresize(I,[256,256]);
    figure, imshow(I,[]); 
    [y,x]=getpts; y=round(y); x=round(x);      % 利用鼠标点击获取种子点 
    J1=zeros(size(I,1),size(I,2));             % 生成和I高宽相同的0矩阵 其中size(I,1),size(I,2)返回矩阵的行列数
    for i=1:length(y)                          
     J = RegionGrowing(I,x(i),y(i)); 
     J1=J1+J;                                  % 每获取一个种子点就将其压入 J1
    end
    figure, imshow(J1);                 
    title('RegionGrowing Segmentation');
    end

    (4) 多点区域生长函数文件/

    %% Region Growing
    % 输入: 种子点(x,y)  输入图像I
    % 输出:区域生长后得到的图像J
    %% for Example:
    % I = im2double(imread('medtest.png'));
    % x=198; y=359;----或者getpts鼠标获取(x,y)
    % J = regiongrowing(I,x,y,0.2); 
    function J=RegionGrowing(I,x,y)
    reg_maxdist=0.2;      
    J = zeros(size(I));                
    Isizes = size(I);                                                    % 输入图像的大小

    reg_mean = I(x,y);                                                   % 分割区域的平均值 初始值为获取的种子点的像素值
    reg_size = 1;                                                        % 区域中的像素数 初始值为1 

    neg_free = 10000; neg_pos=0;                                         % 分配存储内存
    neg_list = zeros(neg_free,3); 

    pixdist=0;                                                           % 区域最新像素到区域平均值的距离
    neigb=[-1 0; 1 0; 0 -1;0 1];                                         % 表示该像素点的附近的(x,y)坐标值(邻域坐标)

    while(pixdist<reg_maxdist && reg_size<numel(I))                      % 开始区域生长,直到区域和可能的新像素之间的距离大于设定的阈值
        for j=1:4                                                        % 添加周围新的像素值                                                      
            xn = x +neigb(j,1); yn = y +neigb(j,2);                      % 计算邻域坐标  
            ins=(xn>=1) && (yn>=1) && (xn<=Isizes(1)) && (yn<=Isizes(2));% 判断像素点是否在邻域内    
            if(ins && (J(xn,yn)==0))                                     % 如果在分割区域的内部并且还不是分割区域的一部分,则添加此像素点
                    neg_pos = neg_pos+1;
                    neg_list(neg_pos,:) = [xn yn I(xn,yn)]; J(xn,yn)=1;
            end
        end
        
        % 分配新内存
        if(neg_pos+10>neg_free), neg_free=neg_free+10000; 
            neg_list((neg_pos+1):neg_free,:)=0; 
        end
        
        % 将像素值最接近该区域平均值的像素添加到该区域
        dist = abs(neg_list(1:neg_pos,3)-reg_mean);
        [pixdist, index] = min(dist);
        J(x,y)=2; 
        reg_size=reg_size+1;
        
        % 计算区域内的新的平均值
        reg_mean= (reg_mean*reg_size + neg_list(index,3))/(reg_size+1);
        
        % 保存该像素点的坐标(x,y) 以便于下一步的添加新的邻域
        x = neg_list(index,1); 
        y = neg_list(index,2);
        
        % 删除已经完成的像素点
        neg_list(index,:)=neg_list(neg_pos,:); 
        neg_pos=neg_pos-1;
    end

        % 返回分割的区域作为逻辑矩阵
    J=J;

     

    展开全文
  • 基于matlab的图像处理中的区域生长,既有较好的分割效果,但是需要人工拾取生长点
  • 基于区域生长法的图像分割matlab代码ICVMBI练习 MATLAB和Python练习课程: 521149S对生物医学图像的计算机视觉方法的介绍 -图像增强 -图像分割 -图像配准 资料基于以前的课程和Jeff Orchard的课程。 一般说明 您可以...
  • 基于区域生长法的图像分割matlab代码Cellmatch – Matlab 在组织学中事后用微型钙荧光显微镜(miniscope)通过体内钙成像记录的用于识别神经元的计算工具箱。 事后识别体内记录的神经元可以对神经元亚型进行细胞类型...
  • 本程序主要功能为实现基于区域生长法的图像分割,选取种子点,并将灰度差值小于阈值的像素点进行合并生长。
  • Matlab工具来实现数字图像处理中的区域生长算法,具有很强的一致性
  • 本程序主要功能为实现基于区域生长法的图像分割,选取种子点,并将灰度差值小于阈值的像素点进行合并生长。
  • 采用区域生长的方式分割图像,用户可以用鼠标在其中选取一个种子点并按下回车键,之后会出现分割结果。
  • matlab区域生长分割代码,选取图像中所需要分割的部分,选取生长种子点,设定阈值进行生长。
  • 区域生长matlab算法

    2019-03-10 19:29:08
    区域生长算法分割图像,有较详细的代码注释,适合对算法有一定了解的人学习代码
  • 基于区域生长法的图像分割matlab代码活细胞成像中神经元的高通量检测和跟踪 Neuritetracker是用于在活细胞成像中对神经元或神经元样细胞进行高通量检测,跟踪和分段的软件。 它分析图像序列,并将结果存储为电影和...
  • 区域生长算法原理-matlab代码实现

    万次阅读 2018-03-29 13:56:58
    1. 基于区域生长算法的图像分割原理数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性。前一种性质的应用途径是基于图像灰度的不连续变化分割图像,比如图像的边缘。第二种性质的主要应用途径...

    1. 基于区域生长算法的图像分割原理

    数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性。前一种性质的应用途径是基于图像灰度的不连续变化分割图像,比如图像的边缘。第二种性质的主要应用途径是依据实现指定的准则将图像分割为相似的区域。区域生长算法就是基于图像的第二种性质,即图像灰度值的相似性。

    1.1 基本公式

    令R表示整幅图像区域,那么分割可以看成将区域R划分为n个子区域R1,,R2,......Rn的过程,并需要满足以下条件:
    a: U(Ri) = R;
    b: Ri是一个连通区域,i=1,2,3,......n;
    c: Ri ∩ Rj = 空集,对于任何的i,j;都有i≠j;
    d: P(Ri) = Ture, 对i=1,2,......n;
    e: R(Pi U Rj) = False, i≠j;
    正如“区域生长”的名字所暗示的:区域生长是根据一种事先定义的准则将像素或者子区域聚合成更大区域的过程,并且要充分保证分割后的区域满足a~e的条件。

    1.2 区域生长算法设计思路

    区域生长算法的设计主要由以下三点:生长种子点的确定,区域生长的条件,区域生长停止的条件。种子点的个数根据具体的问题可以选择一个或者多个,并且根据具体的问题不同可以采用完全自动确定或者人机交互确定。
    区域生长的条件实际上就是根据像素灰度间的连续性而定义的一些相似性准则,而区域生长停止的条件定义了一个终止规则,基本上,在没有像素满足加入某个区域的条件的时候,区域生长就会停止。在算法里面,定义一个变量,最大像素灰度值距离reg_maxdist.当待加入像素点的灰度值和已经分割好的区域所有像素点的平均灰度值的差的绝对值小于或等于reg_maxdist时,该像素点加入到已经分割到的区域。相反,则区域生长算法停止。
    在种子店1的4邻域连通像素中,即2、3、4、5点,像素点5的灰度值与种子点的灰度值最接近,所以像素点5被加入到分割区域中,并且像素点5会作为新的种子点执行后面的过程。在第二次循环过程中,由于待分析图像中,即2、3、4、6、7、8,像素7的灰度值和已经分割的区域(由1和5组成)的灰度均值10.5最接近,所以像素点7被加入到分割区域中。最后一幅图,示意了区域生长的方向(由浅入深)。
    从上面的分析中,我们可以看出,在区域生长过程中,需要知道待分析像素点的编号(通过像素点的x和y坐标值来表示),同时还要知道这些待分析点的像素的灰度值。

    1.3 区域生长算法伪代码

    begin
    初始化变量 pixdist = 0;
    交互式选择一个种子点,并且初始化区域的灰度均值变量reg_mean为该种子点的灰度值。
    while (pixdist < reg_maxdist)
    将当前种子点的四邻域像素点加入到链表neg_list中;
    分别计算neg_list中所有元素的灰度值和reg_mean差的绝对值,并且得到最小值的元素i(x,y).令pixdist = abs(neg_list(i,3)-reg_mean);
    更新 reg_mean = (reg_mean*reg_size + neg_list(i,3))/(reg_size + 1);(注:reg_size表示分割好区域内像素点的数量)
    将旧的种子点标记为已经分割好的区域像素点;
    将i(x,y)当做新的种子点,并将新的种子点i(x,y)从链表neg_list中移除
    end
    end

    1.4 基于MATLAB的区域生长算法设计

    1. % Segment based on area, Region Growing;  
    2. clear  all; close all; clc  
    3. [fileName,pathName] = uigetfile('*.*','Please select an image');%文件筐,选择文件  
    4. if(fileName)  
    5.     fileName = strcat(pathName,fileName);  
    6.     fileName = lower(fileName);%一致的小写字母形式  
    7. else   
    8.     J = 0;%记录区域生长所分割得到的区域  
    9.     msgbox('Please select an image');  
    10.     return; %退出程序  
    11. end  
    12.   
    13. I = imread(fileName);  
    14. if( ~( size(I,3)-3 ))  
    15.     I = rgb2gray(I);%转化为单通道灰度图  
    16. end  
    17. I = im2double(I); %图像灰度值归一化到[0,1]之间  
    18. Ireshape = imresize(I,[600,800]);  
    19. I = Ireshape(51:475,200:699);  
    20. gausFilter = fspecial('gaussian',[5 5],0.5);  
    21. I = imfilter(I,gausFilter,'replicate');  
    22.   
    23. %种子点的交互式选择  
    24. if( exist('x','var') == 0 && exist('y','var') == 0)  
    25.     subplot(2,2,1),imshow(I,[]);  
    26.     hold on;  
    27.     [y,x] = getpts;%鼠标取点  回车确定  
    28.     x = round(x(1));%选择种子点  
    29.     y = round(y(1));  
    30. end  
    31.   
    32. if( nargin == 0)  
    33.     reg_maxdist = 0.1;  
    34.     %nargin是matlab代码编写中常用的一个技巧,主要用于计算当前主函数的输入参数个  
    35.     %数,一般可以根据nargin的返回值来确定主函数输入参数的缺省值。在实现中,如果  
    36.     %用户输入的参数个数为零,那么默认为0.2  
    37. end  
    38. J = zeros(size(I)); % 主函数的返回值,记录区域生长所得到的区域  
    39. Isizes = size(I);  
    40. reg_mean = I(x,y);%表示分割好的区域内的平均值,初始化为种子点的灰度值  
    41. reg_size = 1;%分割的到的区域,初始化只有种子点一个  
    42. neg_free = 10000; %动态分配内存的时候每次申请的连续空间大小  
    43. neg_list = zeros(neg_free,3);  
    44. %定义邻域列表,并且预先分配用于储存待分析的像素点的坐标值和灰度值的空间,加速  
    45. %如果图像比较大,需要结合neg_free来实现matlab内存的动态分配  
    46. neg_pos = 0;%用于记录neg_list中的待分析的像素点的个数  
    47. pixdist = 0;  
    48. %记录最新像素点增加到分割区域后的距离测度  
    49. %下一次待分析的四个邻域像素点和当前种子点的距离  
    50. %如果当前坐标为(x,y)那么通过neigb我们可以得到其四个邻域像素的位置  
    51. neigb = [ -1 0;  
    52.           1  0;  
    53.           0 -1;  
    54.           0  1];  
    55.  %开始进行区域生长,当所有待分析的邻域像素点和已经分割好的区域像素点的灰度值距离  
    56.  %大于reg_maxdis,区域生长结束  
    57.    
    58.  while (pixdist < 0.06 && reg_size < numel(I))  
    59.      %增加新的邻域像素到neg_list中  
    60.      for j=1:4  
    61.          xn = x + neigb(j,1);  
    62.          yn = y + neigb(j,2);  
    63.          %检查邻域像素是否超过了图像的边界  
    64.          ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));  
    65.          %如果邻域像素在图像内部,并且尚未分割好;那么将它添加到邻域列表中  
    66.          if( ins && J(xn,yn)==0)  
    67.              neg_pos = neg_pos+1;  
    68.              neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];%存储对应点的灰度值  
    69.              J(xn,yn) = 1;%标注该邻域像素点已经被访问过 并不意味着,他在分割区域内  
    70.          end  
    71.      end  
    72.     %如果分配的内存空问不够,申请新的内存空间  
    73.     if (neg_pos+10>neg_free)  
    74.         neg_free = neg_free + 100000;  
    75.         neg_list((neg_pos +1):neg_free,:) = 0;  
    76.     end  
    77.     %从所有待分析的像素点中选择一个像素点,该点的灰度值和已经分割好区域灰度均值的  
    78.     %差的绝对值时所待分析像素中最小的  
    79.     dist = abs(neg_list(1:neg_pos,3)-reg_mean);  
    80.     [pixdist,index] = min(dist);  
    81.     %计算区域的新的均值  
    82.     reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);  
    83.     reg_size = reg_size + 1;  
    84.     %将旧的种子点标记为已经分割好的区域像素点  
    85.     J(x,y)=2;%标志该像素点已经是分割好的像素点  
    86.     x = neg_list(index,1);  
    87.     y = neg_list(index,2);  
    88. %     pause(0.0005);%动态绘制  
    89. %     if(J(x,y)==2)  
    90. %     plot(x,y,'r.');  
    91. %     end  
    92.     %将新的种子点从待分析的邻域像素列表中移除  
    93.     neg_list(index,:) = neg_list(neg_pos,:);  
    94.     neg_pos = neg_pos -1;  
    95.  end  
    96.    
    97.  J = (J==2);%我们之前将分割好的像素点标记为2  
    98.  hold off;  
    99.  subplot(2,2,2),imshow(J);  
    100.  J = bwmorph(J,'dilate');%补充空洞  
    101.  subplot(2,2,3),imshow(J);  
    102.  subplot(2,2,4),imshow(I+J);  


    2. 算法实验分析

    2.1 CT图像实验-分割肝脏实质


    2.2 US图像实验-分割肝脏血管

              分割不完整
                                                                                                                                            过分割
          对有明显边界的分割效果好



    3.算法应用总结

    1.对CT图像、MR图像以及所有的具有边界效应,或者是该区域与外界区域有明显差距的图像,分割效果很好。
    2.对感兴趣区域与外接区域存在边缘连通现象的图像,分割效果很差。如超声图像,肝脏对超声的反应就是“均匀性”散点回声。这造成“基于邻域像素相似性”分割很难应用。阈值设置的小,造成分割不完整;阈值设置得太大,造成过分割现象。
    展开全文
  • Matlab图像分割(三)区域生长法

    千次阅读 2020-04-21 16:02:37
    Matlab图像分割——区域生长法分割代码 [fileName,pathName] = uigetfile('*.*','Please select an image');%文件筐,选择文件 if(fileName) fileName = strcat(pathName,fileName); fileName = lower(fileName);%...

    Matlab图像分割——区域生长法分割代码

    [fileName,pathName] = uigetfile('*.*','Please select an image');%文件筐,选择文件
    if(fileName)
        fileName = strcat(pathName,fileName);
        fileName = lower(fileName);%一致的小写字母形式
    else 
        J = 0;%记录区域生长所分割得到的区域
        msgbox('Please select an image');
        return; %退出程序
    end
     
    I = imread(fileName);
    if( ~( size(I,3)-3 ))
        I = rgb2gray(I);%转化为单通道灰度图
    end
    I = im2double(I); %图像灰度值归一化到[0,1]之间
    if( exist('x','var') == 0 && exist('y','var') == 0)
        imshow(I,[]);
        hold on;
        [y,x] = getpts;%鼠标取点  回车确定
        x = round(x(1));%选择种子点
        y = round(y(1));
    end
     J = zeros(size(I)); % 主函数的返回值,记录区域生长所得到的区域
    Isizes = size(I);
    reg_mean = I(x,y);%表示分割好的区域内的平均值,初始化为种子点的灰度值
    reg_size = 1;%分割的到的区域,初始化只有种子点一个
    neg_free = 10000; %动态分配内存的时候每次申请的连续空间大小
    neg_list = zeros(neg_free,3);
    
    neg_pos = 0;%用于记录neg_list中的待分析的像素点的个数
    pixdist = 0;
    neigb = [ -1 0;1  0; 0 -1;  0  1]; %开始进行区域生长
     %大于reg_maxdis,区域生长结束
     
     while (pixdist < 0.06 && reg_size < numel(I))
         %增加新的邻域像素到neg_list中
         for j=1:4
             xn = x + neigb(j,1);
             yn = y + neigb(j,2);
             %检查邻域像素是否超过了图像的边界
             ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));
             %如果邻域像素在图像内部,并且尚未分割好;那么将它添加到邻域列表中
             if( ins && J(xn,yn)==0)
                 neg_pos = neg_pos+1;
                 neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];%存储对应点的灰度值
                 J(xn,yn) = 1;%标注该邻域像素点已经被访问过 并不意味着,他在分割区域内
             end
         end
        %如果分配的内存空问不够,申请新的内存空间
        if (neg_pos+10>neg_free)
            neg_free = neg_free + 100000;
            neg_list((neg_pos +1):neg_free,:) = 0;
        end
        dist = abs(neg_list(1:neg_pos,3)-reg_mean);
        [pixdist,index] = min(dist);
        %计算区域的新的均值
        reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);
        reg_size = reg_size + 1;
        %将旧的种子点标记为已经分割好的区域像素点
        J(x,y)=2;%标志该像素点已经是分割好的像素点
        x = neg_list(index,1);
        y = neg_list(index,2);
        neg_list(index,:) = neg_list(neg_pos,:);
        neg_pos = neg_pos -1;
     end
    
     J = (J==2);%我们之前将分割好的像素点标记为2
     hold off;
     figure,imshow(J);
     figure,imshow(I+J);
    
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 图像分割算法的matlab实现(注意图像路径根据自己电脑自定义)
  • 区域生长算法(附MATLAB代码实现)

    千次阅读 2016-05-07 07:49:00
     区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程。对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻域内符合相似性...

    一、理论概念

      区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程。对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻域内符合相似性判据的像素合并成一个种子群以备下一阶段的生长,这样不断的进行循环生长直到满足生长停止条件为止,从而完成了对感兴趣区域由一个种子点生长为一个独立连通区域的过程。其中相似性判据可以是像素灰度值、颜色、纹理特征等图像信息。

    因此区域生长算法一般分为三个步骤实现:

    (1)    确定生长种子点

    (2)    规定生长准则

    (3)    确定生长停止条件

    实际工程应用中区域生长算法常被用于对二值化图像指定连通区域的分割。图1以图文方式对区域生长算法的三步骤进行解释:

    ①     原始二值化图像(a)中的红色标注的像素为指定生长点;

    ②     图像(b)和(c)是采用不同生长准则进行区域生长的结果,其中图(b)是在4邻域下,待测像素与生长点像素灰度值相等的像素集合。正如图中所示第1次生长时,与生长点像素灰度相等的像素有上、下、左、右四个像素,接着第二次生长时,就由前一次已经生长的像素按照同样的准则进行下去,直到遇到图像边界或背景区域时生长停止。图(c)是在8邻域下,待测像素与生长点像素灰度值相等的像素集合。

    二、MATLAB示例代码实现

    2.1 主函数文件

    %主文件
    clc;
    clear all;
    close all;
    %申明全局变量 R:区域生长的结果图像;BW:二值化图像;counter:感兴趣连通区域的像素个数
    %row:图像的行数;col:图像的列数 
    global R BW counter row col
     
    I = imread('E:\MATLAB仿真\fsr.bmp');
    I = I(:,:,1);
    [row,col] = size(I);
    figure,imshow(I);
     
    level = graythresh(I);
    BW = im2bw(I,level);
    figure,imshow(BW);
     
    [y0,x0] = getpts;
    x0 = uint32(x0);
    y0 = uint32(y0);
    counter = 0;
    R = zeros(row,col);
    R = uint8(R);
    fsrRegiongrow(x0,y0,4);% fsrRegiongrow1(x0,y0,4);
    figure,imshow(R); 

    2.2 函数模块1

    function fsrRegiongrow(x0,y0,mode)
    %功能:        通过函数递归方法对二值化图像指定连通区域实现区域生长                                   
    %输入参数:    x0,y0表示生长点像素坐标,mode表示以多大邻域进行区域生长,常取mode = 4;mode = 8;       
    %输出参数:    void                                                                             
    %作者&时间:   奔跑在湘边———2016年5月6日                                                          
    global R BW counter row col
      
    if 8 == mode
        for i = -1 : 1
            for j = -1 : 1
                x1 = x0 + i;
                y1 = y0 + j;
                %生长准则:判断生长点8邻域内像素的各自灰度值是否与生长点所在像素灰度值相等
                if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
                    R(x1,y1) = 255;
                    counter = counter + 1;
                    fsrRegiongrow(x1,y1,mode);                     
                end
            end
        end
    elseif 4 == mode
        for i = -1 : 1
            x1 = x0 + i;
            y1 = y0;
            if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
                R(x1,y1) = 255;
                counter = counter + 1;
                fsrRegiongrow(x1,y1,mode);       
            end
        end
        x1 = x0;
        y1 = y0 - 1;
        if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
            R(x1,y1) = 255;
            counter = counter + 1;
            fsrRegiongrow(x1,y1,mode);       
        end
        x1 = x0;
        y1 = y0 + 1;
        if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
            R(x1,y1) = 255;
            counter = counter + 1;
            fsrRegiongrow(x1,y1,mode);       
        end
    end
    end
    

    2.3 函数模块2

    function fsrRegiongrow1(x0,y0,mode)
    %功能:        模拟栈的先进后出思路对二值化图像指定连通区域实现区域生长                         
    %输入参数:    x0,y0表示生长点像素坐标,mode表示以多大邻域进行区域生长,常取mode = 4;mode = 8;
    %输出参数:    void                                                                               
    %作者&时间:   奔跑在湘边———2016年5月6日                                                     
    global R BW counter row col
     
    zhan = zeros(row*col,2);%创建栈数组
    pzhan = 1;              %栈计数
    zhan(pzhan,1) = x0;
    zhan(pzhan,2) = y0;
    R(x0,y0) = 255;
    counter = 1;
     
    if 8 == mode
        while pzhan > 0
            x1 = zhan(pzhan,1);%出栈
            y1 = zhan(pzhan,2);
            pzhan = pzhan - 1; %栈计数减一
            for i = -1 : 1
                for j = -1 : 1 
                    %生长准则:判断生长点8邻域内像素的各自灰度值是否与生长点所在像素灰度值相等
                    if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
                        R(x1+i,y1+j) = R(x1,y1);
                        counter = counter + 1;
                        pzhan = pzhan + 1;     %栈计数增一
                        zhan(pzhan,1) = x1 + i;%入栈
                        zhan(pzhan,2) = y1 + j;
                    end 
                end
            end
        end
    elseif 4 == mode
        while pzhan > 0
            x1 = zhan(pzhan,1);
            y1 = zhan(pzhan,2);
            pzhan = pzhan - 1;
            for i = -1 : 2 : 1    
                j = 0;
                if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
                    R(x1+i,y1+j) = R(x1,y1);
                    counter = counter + 1;
                    pzhan = pzhan + 1;
                    zhan(pzhan,1) = x1 + i;
                    zhan(pzhan,2) = y1 + j;           
                end         
            end
            for j = -1 : 2 : 1    
                i = 0;
                if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
                    R(x1+i,y1+j) = R(x1,y1);
                    counter = counter + 1;
                    pzhan = pzhan + 1;
                    zhan(pzhan,1) = x1 + i;
                    zhan(pzhan,2) = y1 + j;           
                end         
            end
        end
    end
    end

    三、说明

    在基于MATLAB7.11.0(R2010b)平台调用函数模块fsrRegiongrow时,MATLAB会弹出如下警告

    ??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)

    to change the limit.  Be aware that exceeding your available stack space can crash MATLAB and/or your computer.

     

    Error in ==> fsrRegiongrow

    上述警告表示递归次数超出了MATLAB默认值,也就是说待处理的感兴趣连通区域像素个数太多(大于500),此时用户可以尝试通过提示的set函数来修改函数递归次数,但是本文通过测试发现如果递归次数超出1591时(不同的平台该值可能不同),MATLAB软件会自动立即关闭。总之,大量的递归调用会建立函数的副本,消耗大量的时间和内存,但是递归可以使得程序结构清晰易懂,所以本文给出函数递归的方法来实现区域生长只是提供一个思路,如果待处理的连通区域像素个数很多,调用fsrRegiongrow1函数就可以了!fsrRegiongrow1函数模块是在堆上创建栈数组模拟栈的先进后出思想来实现的,可以快速的实现区域生长。

    四、实验结果

     

    转载于:https://www.cnblogs.com/fengshengri/p/5467685.html

    展开全文
  • matlab图像处理--区域生长法

    万次阅读 多人点赞 2018-05-10 16:48:50
    区域生长法区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程。对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻域内...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 507
精华内容 202
关键字:

区域生长法matlab代码

matlab 订阅