区域生长算法(附MATLAB代码实现)

一、理论概念

  区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程。对于图像感兴趣目标区域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函数模块是在堆上创建栈数组模拟栈的先进后出思想来实现的,可以快速的实现区域生长。

四、实验结果

时间: 2024-08-29 13:54:01

区域生长算法(附MATLAB代码实现)的相关文章

Ncut算法的MATLAB代码下载及实现在MATLAB上正常运行

这里我所使用的平台是:win7(64bit)+MATLAB2014a(64bit) Ncut算法全称应该是:Multiscale Normalized Cut image segmentation,是图像分割算法.可以说是我目前研究生生涯使用到的分割效果比较理想的一种图像分割算法, 代码的下载地址:http://timotheecour.com/software/ncut_multiscale/ncut_multiscale.html 进入下载地址界面后,你会看到如下面截图所示的地方,这里我们下

在C#的Web项目中调用Matlab代码的方法

为了毕设的图形检索方向的研究,本人需要在信科的师兄师姐们已经完成的C#界面中,调用现在研究的算法的Matlab代码,以便看到实验的效果.前段时间已经拖延了1个多月,一方面因为实习越来越多事情,时间减少了很多:但更重要在于C#调用Matlab的方法真心麻烦,C#的Web项目中进行这个操作貌似会碰到更多细节上的问题.而且总是很不稳定,操作系统.Matlab或VS的版本.遗漏一些文件或步骤都会造成失败!这个问题本人已经搞了很长时间,直至前几天,在同学的帮助下,自己再弄一遍,总算成功了!下面我及时把这个

自动曝光修复算法 附完整C代码

众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了使感光器件获得合适的曝光量 AW自动白平衡(Automatic White Balance)白平衡的本质是使白色物体在任何光源下都显示白色 前面的文章也有提及过,在刚开始做图像算法的时候,我是先攻克的自动白平衡算法. 后来攻克自动曝光的时候,傻啦吧唧的,踩了不少坑. 我相信一定不止我一个,一开始的时

基于傅里叶变换的音频重采样算法 (附完整c代码)

前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲,我精力有限,但一般都会抽空回复一下. 大多数情况,阅读一下代码就能解决的问题, 也是要尝试一下的. 没准,你就解决了呢? WebRtc的采样算法本身就考虑到它的自身应用场景, 所以它会有一些局限性,例如不支持任意采样率等等. 而简洁插值的这个算法, 我个人也一直在使用,因为简洁明了,简单粗暴. 我自

Poisson image editing算法实现的Matlab代码解析

之前我发了数篇系列博文来仔细研究Poisson Image Editing算法,每次重新审视和深入,仿佛都能有更为深刻的认识和很大的收获.这应该算是我这个系列的完结篇,会用用Matlab代码一点一点的演示,原文作者到底是如何设计和实现他那个强大且影响深远的算法的.希望你在看本文之前务必参考一下文章来了解算法原理,本文将主要讲解编程实现的问题,对于前面讲过的内容,我不会深究.但我个人总体的感觉是,现在图像处理算法对数学的要求是越来越高了,像泊松融合.泊松抠图这样的算法如果没有偏微分方程(本算法中涉

图片文档倾斜矫正算法 附完整c代码

2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 反倾斜  Deskew 等等. 最简单算法实现思路,采用 霍夫变换(Hough Transform)进行直线检测, 当然也可以用霍夫变换检测圆. 在倾斜矫正算法中,自然就是检测直线. 通过对检测出来的直线进行角度判断, 一般取 认可度最高的几条直线进行计算, 最后求取均衡后的角度值. 进行图像角度

mser 最大稳定极值区域(文字区域定位)算法 附完整C代码

mser 的全称:Maximally Stable Extremal Regions 第一次听说这个算法时,是来自当时部门的一个同事, 提及到他的项目用它来做文字区域的定位,对这个算法做了一些优化. 也就是中文车牌识别开源项目EasyPR的作者liuruoze,刘兄. 自那时起就有一块石头没放下,想要找个时间好好理理这个算法. 学习一些它的一些思路. 因为一般我学习算法的思路:3个做法, 第一步,编写demo示例. 第二步,进行算法移植或效果改进. 第三步,进行算法性能优化. 然后在这三个过程中

音频降噪算法 附完整C代码

降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据为主,矩形数据分布. 音频更偏向 时间 处理,例如语音中的某短时长. 音频一般是一维数据为主,单声道波长. 处理方式也是差不多,要不单通道处理,然后合并,或者直接多通道处理. 只是处理时候数据参考系维度不一而已. 一般而言, 图像偏向于多通道处理,音频偏向于单通道处理. 而从数字信号的角度来看,也可

区域生长算法(C# 实现)

区域生长算法 2014年9月19日 17:01:44 大道理一摆: (以下说明转载,感觉写的很好) 历史:区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的.该方法一般有两种方式,一种是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的:另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规